2016-05-11 3 views
-1

文字列に数値をかける単純なcコードを書いていたので、私には分かりません。このコードでは:数値を文字列に変換する

void itos(int a,char *p){ 
    int pom = a; 
    do{ 
     p++; 
     pom/=10; 
    }while(pom); 
    *p = '\0'; 
    do{ 
     pom = a%10 + '0'; 
     *--p = pom; 
     a/=10; 
     }while(a); 
    } 

私はセグメンテーションフォールトを取得し続けていますが、なぜ私は理解できません。文字列はアドレスによって渡されるので、メインからの文字列には関数内の文字列へのアクセスがあってはいけませんか?一方、このコードはpefectly作品:

 char *itos(int a,char *p){ 
    int pom = a; 
    do{ 
     p++; 
     pom/=10; 
    }while(pom); 
    *p = '\0'; 
    do{ 
     pom = a%10 + '0'; 
     *--p = pom; 
     a/=10; 
    }while(a); 
    return p; 

    } 

Somoneのは私にdiffrence(特に、なぜ最初のものが動作していない)を説明することができれば、私はextremlly GREATFULだろう。

+3

2つの値は戻り値が異なるだけでなく、この関数を呼び出すコードも投稿してください。 – fluter

+0

既に答えがあります。ポインターはcorectlyで初期化されませんでした。助けてくれてありがとう! – sale

答えて

0

2つの関数は戻り値によってのみ異なり、1つはポインタpを返し、もう1つは何も返しません。だから、あなたは、渡されたポインタが有効なアドレスに初期化させる、つまり、それはバッファを指す:

char str[100]; 
itos(a, str); 

または

char *str = malloc(100); 
itos(a, str); 

整数を文字列に変換するには、あなたはそれを印刷することができます:

char str[100]; 
int n; 
snprintf(str, sizeof str, "%d", n); 
+0

ああ、私はそれを知らなかった。しかし、私はまだ盗んで上記のコードは動作していない.. – sale

+1

@saleは、関数に渡されたポインタを初期化するのですか? – fluter

+0

これで問題は解決しました。どうもありがとうございました! – sale

関連する問題