2012-04-13 34 views
1

私はすでに他の質問などを見てきましたが、strtokの最初の引数は編集できないが、私はこのコードではないと思うセグ障害が起こる? strtokを間違って使用していますか?strtok()segフォールト

このコードでは、stdinをcsvカンマ区切り形式で入力し、stdinから数字を追加してstdout、p.sに出力します。私はそれがトークンがポインタではないときに動作していました。 i+= token;しかし、私は予想通りにランダムな出力を得ていました。

#include <stdio.h> 
#include <string.h> 
int main(){ 
char *token, input[256]; 
int i = 0; 

scanf("%s" , input); 
token = strtok (input, ","); 

while(token != NULL){ 
    token = strtok(NULL, ","); 
    i += *token; 

     }     

printf("%d\n", i); 
return 0; 
    } 

おかげで、いくつかの点strtokでラクラン

答えて

7

はあなたがチェックしませんNULL返します。

token = strtok(NULL, ","); 
i += *token; /* Will dereference NULL. */ 

を代わりにあなたがやるべきこと:

while(token != NULL){ 
    i += *token; /* We know `token` isn't NULL. */ 
    token = strtok(NULL, ","); 
} 

を側面としあなたがやっていること、つまり文字の値を加えることは、ほとんど意味がないことに注意してください。おそらくstrto(u)lを使用して、何らかの形でそれらを変換したいと思うでしょう。

+0

Doh!申し訳ありません。 – UNECS

+0

私の知らないこと私の研究で見つからなかった 'strtol(token)'トークンを 'NULL'に変更しましたか? – UNECS

+0

@ LachlanMcGivern 'strtol'は最初の引数を変更しません。 – cnicutar

0

i+=*tokenを実行する前に文字列を整数に変換する必要があります。文字列を整数に変換するstrtolなどの関数を見てください。

関連する問題