2012-04-17 21 views
1

私は文を単一のスペースだけで区切られた単語にトークン化しようとしています。 私は文章から単語を得て、それを購読された配列に書き込む必要があります。 は、ここに私の仕事です:文のトークン化をCで

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++; 

     } 

そして、私がメインからデバッグするために、これだけで関数を呼び出す:

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

を、それがEOF例外だときそれがないときのようにフリーズが。 ありがとうございました。

答えて

4

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

試してみてください。

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

sentence文字の変更可能な配列になります。

また、トークンをコピーするループでは、各エントリの末尾にヌルターミネータが挿入されないことに注意してください。おそらくそれらが必要になると思われます。たぶん試してください:あなたが考えなければならない

strcpy(words[j], tokenPtr); 

他のものが含まれます:あまりにも多くのトークンの文字列を取得

  • 長すぎるかもしれません

    • 取り扱いトークンを場合は何をすべきか
    • トークンの間に複数のスペースがあります。strtok()はあなたにとって重要であれば対処しません(私はあなたの質問でトークンが「単一のスペースだけで区切られている」ということを特に言及しているからです)
  • +0

    いいですよ。ありがとうございます。 – Umut

    1

    まあ、多分これはあなたを助けることができる:

    main
    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; 
    } 
    

    そして:

    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++; 
    } 
    

    はそれがお役に立てば幸いです。

    1

    文字列は、 "a"が2文字長の配列arrを意味するデリミタとして終了することに注意してください(arr [0]は 'a'、arr [1]は '\ 0'あなたは書きたいことがあります。

    a = strlen(tokenPointer) + 1 
    

    strncopyが有用である可能性がある、それは文字列の長さをコピーすることです三番目のパラメータを持つstrcopyだ。

    それはあなたの文字列をループし、あなたの機能を簡素化し保存しますおそらくあなたにとって貴重です。

    enrmarcは、 yはあなたがそれをするかもしれない1つの方法です、あなたは不揃いの配列をあなたが必要とする正確なサイズにするでしょう。また、文字列IE char * stringArr [10]へのポインタの配列を呼び出して、最初のトークンにstringArr [0]を割り当てることもできます。私はそれがあなたが望むものではないと仮定するつもりです。

    フォローマイケルバリのアドバイス、そしてまたあなたの関数定義は、おそらくより多くのようになります。

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

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

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

    あなたが整数のIと%dにCVALと%cでCを変更することができますというように、それはあなたのプログラムの中で、あなたが問題を抱えて場所がわから助けることができます。

    関連する問題