1

文を単一スペースのみで区切られた単語にトークン化しようとしています。文から単語を取得し、サブスクライブした配列に書き込む必要があります。これが私の仕事です:

void writeToStrArrayOneByOne(char words[10][20], char *sentence){

       char *tokenPtr;
       int j = 0;
       int a,i;
       tokenPtr = strtok(sentence," ");

       while(tokenPtr != NULL){


          a = strlen(tokenPtr);

          for(i=0;i<a;i++){

                words[j][i] = tokenPtr[i];
          }
          tokenPtr = strtok(NULL," ");
          j++;

       }

そして、 main からデバッグするために、これだけで関数を呼び出します:

     char words[10][20];
     char *sentence = "this is a token";
     writeToStrArrayOneByOne(words,sentence);

ただし、EOF例外の場合と同様にフリーズします。助けていただきありがとうございます。

4

3 に答える 3

4

strtok()渡された文字列を変更します。変更できない文字列リテラルを指定しています。

試す:

char sentence[] = "this is a token";

これによりsentence、変更可能な文字の配列が作成されます。

また、トークンをコピーするループでは、各エントリの最後にヌル ターミネータが配置されないことに注意してください。おそらくそれらが必要になると思います。多分試してください:

strcpy(words[j], tokenPtr);

他に考えるべきことは次のとおりです。

  • 長すぎる可能性のあるトークンの処理
  • トークンが多すぎる文字列を取得する
  • トークン間に複数のスペースがある場合に何をする必要があるか-strtok()それがあなたにとって重要な場合は対処しません(これについて言及するのは、質問でトークンが「単一のスペースのみで区切られている」と具体的に述べているためです)
于 2012-04-17T21:30:00.470 に答える
1

文字列は区切り文字として '\0' で終わることに注意してください。これは、"a" を含む配列 arr が 2 文字の長さであることを意味します (arr[0] は 'a'、arr[1] は '\0' です。書きます。

a = strlen(tokenPointer) + 1

strncopy も役立つ場合があります。コピーする文字列の長さである 3 番目のパラメーターを持つ strcopy です。

文字列をループする手間を省くことができ、関数を単純化することはおそらく価値があります。

enrmarc は、メモリを動的に割り当てることが 1 つの方法であることは正しいです。不規則な配列を必要な正確なサイズにします。また、文字列 IE char* stringArr[10] へのポインターの配列を呼び出してから、stringArr[0] を最初のトークンなどに割り当てることもできます。それはあなたが望んでいるものではないと思います。

Michael Burr のアドバイスに従ってください。また、関数定義はおそらく次のようになります。

void writeToStrArrayOneByOne(char words[][], char sentence[])

最後に、デバッグは難しく、あなたの質問に正確には答えませんでした。いくつかのプリプロセッサ マクロを使用すると簡単になります。以下を使用してみてください。

#define PRINT_CVAL(a) printf(#a "contains %c\n", a)

CVAL の C と %c を I と %d に整数などに変更すると、プログラムのどこに問題があるかを知るのに役立ちます。

于 2012-04-17T22:36:42.047 に答える
1

まあ、多分これはあなたを助けるかもしれません:

char** split (char* string, const char* delim) {
   char* p;
   int i = 0;
   char** array;

   array = malloc(strlen(string) * sizeof (char*));
   p = strtok (string, delim);
   while (p != NULL) {
      array[i] = malloc(sizeof(char) );
      array[i++] = p;
      p = strtok(NULL, delim);
    }
  return array;
}

そして、でmain

char s[128] = "Est2,2011,11,02,00,10,madrid,-3.467,44.3578,17.0";
char **array = split(s, ",");
int i = 0;
while (*array){
    printf("[%s]\n", *array++);
    i++;
}

それが役に立てば幸い。

于 2012-04-17T21:34:40.330 に答える