1

stdin exから1行ずつ読み取るコードを以下に書きました。

都市=ボストン;都市=ニューヨーク;都市=シカゴ\n

次に、各行を「;」で分割します 区切り記号を付けて、各レコードを印刷します。

しかし、何らかの理由で、「レコード」ポインターは常に null に戻ります。なんで?

    char    del = ';';
    char    input[BUFLEN];

    while(fgets(input, BUFLEN, fp)) {

            input[strlen(input)-1]='\0';
            char* record = strtok(input, &del);

            while(record) {
                    printf("Record: %s\n",record);
                    record = strtok(NULL, &del);
            }
}
4

5 に答える 5

3

strtok2 番目の引数の末尾にヌル (ゼロ バイト) を含む文字列が必要です。delなるように変更

 char * del = ";"

これは完全なプログラムです(入力読み取り部分を除く):

#include <string.h>
#include <stdio.h>

int main ()
{
   char*    del = ";";
   char * input = strdup ("city=Boston;city=New York;city=Chicago\n");
   char* record = strtok (input, del);
   while (record) {
       printf("Record: %s\n",record);
       record = strtok (NULL, del);
   }
}

試してみてください: http://codepad.org/tzzxjOJE

一度に複数の文字列を処理できるという利点を持つstrsep関数もあります。

于 2009-11-13T02:20:45.623 に答える
2

char * del = ";"; を試してください。

2 番目のパラメータは、ヌルで終了する文字列、つまりヌルで終了する文字の配列である必要があります。

そして、del を strtok に渡します。

   char*    del = ";";
   char    input[BUFLEN];

    while(fgets(input, BUFLEN, fp)) {

            input[strlen(input)-1]='\0';
            char* record = strtok(input, del);

            while(record) {
                    printf("Record: %s\n",record);
                    record = strtok(NULL, del);
            }
     }
于 2009-11-13T02:20:40.520 に答える
2

strtok() への呼び出しは、segfault になる可能性が非常に高くなります。&del が指す char * には NULL ターミネータがありません。

于 2009-11-13T02:21:11.097 に答える
2

strtok()デリミタ文字列は、ヌルで終わる C 文字列とまったく同じであることが期待されます。セミコロンは null 文字ではないため、明らかに null で終わる文字列ではありません。代わりに、これを試してください:

char del[] = ";";
于 2009-11-13T02:21:46.743 に答える
1

よくわかりませんが、del の最後に適切な '\0' がないためだと思います。

文字列が NULL で終了していることを確認する必要があります。または、ほとんどの文字列関数が変数の後にメモリを読み取るため、多くの問題が発生する可能性があります

このようなものが良いでしょう:

    char    *del = ";";
    char    input[BUFLEN];

    while(fgets(input, BUFLEN, fp)) {

            input[strlen(input)-1]='\0';
            char* record = strtok(input, del);

            while(record) {
                    printf("Record: %s\n",record);
                    record = strtok(NULL, del);
            }
}
于 2009-11-13T02:21:22.570 に答える