2016-09-06 14 views
1

私は、cstringを単語の配列に分割する関数を作成しようとしています。例えば。私が "Hello world"で送信すると、1位に要素 "Hello"、2番目の "world"がある2つの場所の配列が得られます。私はセグメンテーションフォルトを取得していると私は私の人生のために間違っているように思うことができない。 forループIは、(間隔が単語の数= N、常にN-1)合計であるどのように多くの単語決定する、あるどのように多くのスペースを確認していでは文字列をCの単語の配列に分割する

  • 。次に、カウンタに1を加算するようにプログラムに指示します(N-1のため)。

  • 私は個々の単語は、私はここにカウンタ+ 1が必要かどうかわからない区切られた各保つために*配列[] charとして宣言し(なぜなら\ 0のを?)

  • これは、トリッキーな部分が入ります。私はstrtokを使って各単語を区切ります( ""を使用)。次に、char * array []の各位置をmallocして、単語を格納するのに十分なメモリを確保します。中に入れるワードがなくなるまで、これが行われます。

誰かが私にセグメンテーション違反の原因となっている一部のヒントを与えることができれば、私はそれを本当に感謝します!

void split(char* s){ 

    int counter = 0; 
    int pos = 0; 

    for(int i=0; s[i]!='\0'; i++){ 
     if(s[i] == ' '){ 
      counter ++; 
     } 
    } 
    counter += 1; 

    char* array[counter+1]; 

    char *token = strtok(s, " "); 

    while(token != NULL){ 
     array[pos] = malloc(strlen(token)); 
     strcpy(array[pos], token); 
     token = strtok(NULL, " "); 
     pos++; 
    } 
+1

malloc(strlen(トークン)+1) ' – BLUEPIXY

+0

どこで失敗するかを見つけるために、a)デバッガの下で実行する、b)valgrindを使う(linux ) – pm100

+0

c)正気な人のようにprint文を追加するだけです –

答えて

3

私は「こんにちは」に送信する場合、私は 1位は、「こんにちは」秒「の世界を」要素を持っている二つの場所の配列を取得したいです。

いいえ文字列リテラルをその関数に渡すことはできません。 strtok()は入力を変更するためです。したがって、文字列リテラルを変更しようとします。その結果、undefined behaviourになります。

strtok()の制限に注意してください。 strtok()のmanページから:

Be cautious when using these functions. If you do use them, note 
    that: 

    * These functions modify their first argument. 

    * These functions cannot be used on constant strings. 

    * The identity of the delimiting byte is lost. 

    * The strtok() function uses a static buffer while parsing, so it's 
    not thread safe. Use strtok_r() if this matters to you. 

だから、あなたはstrtok()を使用したい場合は、変更可能メモリ位置へのポインタを渡す必要があります。


BLUPIXYが指摘したように、あなたのmalloc()呼び出しは、十分なスペースを割り当てません。文字列の長さより1バイト多く必要です(終了ナルバイトの場合)。

+0

変更可能なメモリ位置にポインタを渡しますか?例を挙げていただけますか?私はchar * s(パラメータ)がすでにポインタであると考えました – LuftWoofe

+0

たとえば、配列を渡します。 'char arr [] =" Hello world ";分割(arr); ' – usr

+0

オハイオ州参照してください。私はこれを実験して、それがどうやって戻ってくるかを報告します! – LuftWoofe

関連する問題