2016-09-27 16 views
-3

文字列をポインタの配列に変換するコードを記述しようとしていますが、各ポインタはその文字列内の単語を指しています。下のコードをコンパイルして、最初のループ内のすべての単語を別々に印刷すると、すべての単語が問題なく終了しますが、ループが終了した後、ループ内の各単語をループで印刷しようとすると、文字列の最後の単語です。文字列へのポインタの配列への変換

私たちは、この関数に「ABは、CD EF」を渡された場合は、最後のループが

ef then ef then ef 

が印刷されますが、私は最初のループで配列の各要素を印刷する場合、それが印刷されます

ab then cd then ef 

コード

void sort(char* str) 
{ 
    char* a[100]={NULL}; 
    char *tStr2,*min,*temp; 
    tStr2=(char*)malloc(strlen(str)); 
    int i=0,i2=0,j=0; 
    while(i<=strlen(str)) 
    { 
     if(str[i]!=' ' && i!=strlen(str)) 
     { 
      tStr2[i2]=str[i];  //copy every word separately to tStr2[] 
      i2++; 
     } 
     else 
     { 
      tStr2[i2]=NULL; 
      a[j]=tStr2;   //word is complete --> copy it to the array 
      printf("%s \n",a[j]); //print every word 
      j++; 
      i2=0;     //initializes the word counter 
     } 
     i++; 
    } 
    i=0; 
    for (i=0;a[i];i++)   //loop is complete , print all array elements 
     printf("%s \n",*a[i]); 
} 
+0

'std :: string'と' std :: vector'と 'std :: stringstream'はあなたの友人です。 – NathanOliver

+3

これはCまたはC++ですか? –

+0

1)CはC++ではありません。CはCではありません。2)そのうちの1つを選択します。3)コードをフォーマットします。それは判読不能です。 – Olaf

答えて

0
a[j]=tStr2;

コピー012の様々なelmentsに同じポインタ。だから後でコードがa[j]を印刷するとき、それはテキストを参照します。

コードは、さまざまなa[j]要素に異なるポインタを保存する必要があります。たぶん一般的だが非標準的な単純なもの、strdup()

a[j] = strdup(tStr2); 

free()に追加コードが必要です。

別のアプローチは、一度strをコピーして、その' ''\0'とを交換し、様々な始まり「言葉」にa[j]ポイントを持っているでしょう。

+0

でGNU GCCコンパイラを使用していますが、最初のprintfもう1つはありませんか? –

+0

@Ahmed M. Salahあなたのコード 'a [j] = tStr2;でそれぞれは_same_バッファから出力します:' tStr2'。最初のループ 'printf()'が呼び出され、 'a [0]'は 'tStr2'を指し、' tStr2 [] 'は' 'ab" 'を持ちます。次の最初の 'printf()'ループが呼び出されると、 'a [1]'は 'tStr2'を指し、' tStr2 [] 'は' 'cd" 'を持ちます。最後の 'printf()'ループが最後に呼び出されたとき、 'a [2]'は 'tStr2'を指し、' tStr2 [] 'は' 'ef ''を持ちます。 2番目の 'printf()'が呼び出されると、 'a [0]、a [1]、a [2]'はすべて同じバッファを指します: 'tStr2'。そのバッファには '' ef ''が含まれています。 – chux

+0

あなたはこの行動を説明した男であり、strdup()はこのコードを改善するためのアドバイスを –

関連する問題