0

やあみんな私はstrtokでセグメンテーション違反を起こしている、ちょっと助けが必要だ!

char s[1024];
char *token[2];
while(fgets(s, sizeof(s), fp) != NULL) // Read line from file fp until end
{
    token[0] = strtok(s, "\t\n");
    token[1] = strtok(NULL, "\t\n");
    token[2] = strtok(NULL, "\t\n");
    printf("%d:%s:%d", atoi(token[0]), token[1], atoi(token[2]));
}

しかし、ループの最初の通過後にセグメンテーション違反が発生します。入力ファイルは次のようになります。

102910319    code    mark
.
.
.
104981851    code    mark

ただし、whileループは最初の行を正しく出力し、2番目の行にセグメンテーションフォールトを出力するだけです。

なぜ何かアイデアはありますか?

ありがとう。

4

3 に答える 3

2

配列のインデックス作成の問題。

ポインタの配列を次のように宣言する必要があります。

char *token[3];
于 2013-03-23T03:45:22.163 に答える
0

char *ジャックが言ったように、 token は 2 つの s:token[0]とを格納するように宣言されていtoken[1]ます。token[2]範囲外です。これに対する解決策は、 token: の宣言を変更することですchar *token[3];

さらに、どこかで入力の「単語」が 3 つ未満である可能性があります。この場合%s、NULL ポインターが指す文字列を出力するように printf に指示するか、2 番目のatoi呼び出しで NULL ポインターを逆参照しようとします。解決策は、token[1]printf にtoken[2]渡す前、および に渡す前に確認することatoiです。printf("%d:%s:%d", atoi(token[0]), token[1] ? token[1] : "null", token[2] ? atoi(token[2]) : 0);

または、これには scanf の方が適しているようです。

int x, y;
char str[1024];
while (scanf("%d %1023s %d", &x, str, &y) == 3) {
    printf("%d:%s:%d\n", x, str, y);
}
于 2013-03-23T03:56:43.157 に答える