2012-01-19 27 views
0

長さを要求せずに文字列を取得する必要があります 私は100文字のバッファを作成し、満杯の場合はcharにスペースを追加するためにreallocを行います。文字列の末尾C文字数を知らずに文字列を割り当てます

これは私のコードです...あなたは私を助けることができますか?ここ

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char **argv) 
{ 
    char *content = malloc(10*sizeof(char)); 
    char c; 
    content[0]='\0'; 

    while ((c = getchar()) != EOF) 
    { 
     if (strlen(content) < 10){ 
      strcat(content, &c); 
      content[strlen(content)+1] = '\0'; 
     } 
     else { 
      content=realloc(content,sizeof(char)*(strlen(content))+2); 
      strcat(content, &c); 
      content[strlen(content)+1] = '\0'; 
     } 
    } 
    printf("%s",content);  

    return 0; 
} 
+0

どうしたのですか?このコードを試しましたか?多分それはすでに正しいですか? –

+0

10文字を超えると、各文字の読み込みに 'realloc'を行います... – Lindydancer

+0

なぜscanfを使うのか取得できません。 – riship89

答えて

2

いくつかの問題:

  1. は、そのようなstrcatを使用しないでください!単一のcharへのポインタではなく、終了した文字列の\0へのポインタを渡す必要があります。これは偶然にしか動作しません。
  2. strlen()の代わりに、割り当てられたメモリサイズを別の変数に記録してください。
  3. strlen()を常に呼び出すのではなく、別の別の変数を使用して文字列内の位置を追跡します。ループが終了したら、終端記号\0を一度設定します。
  4. より良い再配置戦略は、チャンク単位で、すなわちすべてのバイトではなく、メモリ割り当てを増やすことです。割り当てられたメモリが使い果たされるたびにXバイトを割り当てることができます。または、割り当てられたバイト数を2倍にすることもできます。
0

あなたは@cnicutarが提案何をすべき:

content[index] = c; 

また、あなたのコード内の別の問題があります。 "c"を "content"に連結すると、 "content"の最後に '\ 0'が上書きされます。 strlenは '\ 0'を探します。

別の問題がある:あなたはstrlenは9であるときは、コンテンツに '\ 0' を

content[strlen(content)+1] = '\0'; 

置くことになります[10]。あなたはサイズ10の "content"を割り当てているので、それはcontent [0]からcontent [9]に行くという意味です。

シンプル

content[strlen(content)] = '\0'; 

あなたが欲しいものを行う必要があります。

+0

"strcat()とstrncat()関数は、NULL終了文字列s2のコピーをNULL終了文字列s1の末尾に追加し、 0 ' – mvds

関連する問題