1

文字列トークンをチェックしてファイルを解析する短い関数を書いています。テストに使用しているファイルの9行目である「visgroups」(* sourceというバッファーにあります)に到達すると停止するはずです。「versioninfo」は最初の行です。このコードを実行すると、プログラムを手動でキャンセルするまで、「versioninfo」が繰り返し出力されます。strtok関数が動かないのはなぜですか?

このポイントに到達したら、ソースのさまざまな操作を実行します。そのため、ループ制御変数は「アクティブ」と呼ばれます。これは、strtokがスレッドセーフではないという事実と関係がありますか?他のスレッドではソースを使用していません。

int countVisgroups(int *visgroups, char *source) {
    const char delims[] = {'\t', '\n', ' '};
    int active = 0;
    char *temp;
    while (!active){
        temp = strtok(source, delims);
        if (temp == NULL) {
            printf("%s\n", "Reached end of file while parsing.");   
            return(0);  
        }
        if (strncmp(temp, "visgroups", 9) == 0) {
            active = 1; 
            return(0);  
        }
        printf("%s\n", temp);       
    }
    return(0);
}
4

2 に答える 2

3

配列はヌルdelims終了する必要があります。それ以外の場合strtok、渡したセパレータの数をどのように知ることができますか?通常は使用するconst char *delims = "\t\n "だけですが、初期化子に追加..., 0するだけでもかまいません。

于 2012-11-22T21:15:53.383 に答える
2

トークン化する文字列を使用した最初の呼び出しの後、strtok後続のすべての呼び出しは、最初のパラメーターをNULLに設定して実行する必要があります。

temp = strtok(NULL, delims);

そして、おそらくスレッドセーフとは何の関係もありません。

次のように書き直してみてください。

int countVisgroups(int *visgroups, char *source) {
   const char delims[] = {'\t', '\n', ' ', '\0'};
   int active = 0;
   char *temp;
   temp = strtok(source, delims);
   while (!active){
       if (temp == NULL) {
           printf("%s\n", "Reached end of file while parsing.");   
           return(0);  
       }
       if (strncmp(temp, "visgroups", 9) == 0) {
           active = 1; 
           return(0);  
       }
       printf("%s\n", temp);    
       temp = strtok(NULL, delims);   
   }
   return(0);
}
于 2012-11-22T21:15:09.910 に答える