7

わかった。たとえば、txtファイルに次の行があります。

1|1,12;7,19;6,4;8,19;2,2
ご覧のとおり、で区切られた2つの部分があり|ます。1,12;7,19;6,4;8,19;2,2両方のパーツを取得し、セパレータを使用して2番目のパーツを分離することに問題はありません;。しかし、私は,各セットの最初と2番目の数を取得することによってさらに分離することに問題があります。

これは私の現在のコードです:

  result = strtok(result, ";");

  while(result != NULL ) {
      printf("%s\n", result);
      result = strtok(NULL, ";");
  }

それは私を出力します:

1,12
7,19
6,4
8,19
2,2

OK、素晴らしい。しかし、次のように「strtok」(分割にこのメソッドを使用しています)しようとすると、次のようになります。

 result = strtok(result, ";");

 while(result != NULL ) {
     //printf("%s\n", result);
     help    = strtok(result, ",");    
     while(help != NULL) {
         printf("<%s>", help);
         help = strtok(NULL, ",");
     }

     result  = strtok(NULL, ";");
 }

この数字のセットには1つのセットしかないように、「<1>、<12>」しか表示されません。残りの数字はどこにあるのかわかりません。代わりに、出力は<1>、<12>、<7>、<19>、<6>、<4>、<8>、<19>、<2>、<2>になります。誰かが解決策を教えてもらえますか、各セットの各セットの番号を取得する方法、この番号のセット。たぶん他の方法があるか、私は何か間違ったことをしています:)

ありがとうございました!

4

5 に答える 5

6

元の文字列の変更に関してNeilが指摘したことに加えて、このstrtok()関数は、説明したようにネストされた方法で使用されるようには設計されていません。機能を調査するか、家族strtok_r()の使用を完全に避けたいと思うかもしれません。strtok*

于 2010-04-10T09:45:01.587 に答える
3

char * strtok(char * str、const char * delim); (マニュアルページから)delim引数は、解析された文字列内のトークンを区切る文字のセットを指定します
。呼び出し元は、同じ文字列を解析する連続した呼び出しで、 delimで異なる文字列を指定できます。

したがって、との両方;,区切り文字として使用して、すべての数値を取得します。

//this will delimit result whenever ";" or "," is found
result = strtok(result, ";,"); 

while(result != NULL ) {
    printf("%s\n", result);
    result = strtok(NULL, ";,");
}
于 2010-04-10T09:43:42.067 に答える
2

他の人が指摘しているように、strtok()リエントラントではありません-解析している文字列に関する内部状態を維持するため、2つの異なる文字列を同時に解析するために使用することはできません(つまり、最初の引数に2つの異なる非NULL値があるため、状況は重要です)。

再入可能なバージョンがstrtok_r()利用可能な場合は、次のように使用するようにコードを変更できます。

char *st_result, *st_help;
result = strtok_r(result, ";", &st_result);

while (result) {
     printf("[%s]", result);
     help = strtok_r(result, ",", &st_help);    
     while (help) {
         printf("<%s>", help);
         help = strtok_r(NULL, ",", &st_help);
     }

     result = strtok_r(NULL, ";", &st_result);
}
于 2010-04-10T12:12:21.553 に答える
1

最初のstrtokは、元の文字列をいくつかのnullで終了する文字列に分割します。2番目のstrtokは、これらの文字列の最初の文字列にのみ適用されます。最初のstrtok呼び出しによって作成された最初のnullターミネータで停止します。最初の文字列によって作成された文字列のそれぞれについて、2番目のstrtokコードを呼び出す必要があります。

于 2010-04-10T09:43:52.147 に答える
1

Cstrtokは、セパレータの代わりにNULLを挿入して、ソース文字列を変更するという点でかなり悪です。したがって、2番目のループは、外側のループによって挿入されたNULLに達すると停止します。;必要なのは、区切り文字列へのポインタを別の場所に保存してから、strtokそれぞれを個別に保存することです。

または、ネストされたループを使用する場合は、ここを参照してください

于 2010-04-10T09:48:15.797 に答える