2012-01-12 23 views
2

私はC言語を学んでおり、いくつかのC文字列を処理する必要があります。私は本当にCと、特に自由な記憶のものに揺れているので、私の質問が間違っている場合はお知らせください。C文字列の連結とダブルサイズ?

私は空のC文字列、たとえばサイズ5を持っており、一度に1文字ずつそれに文字を追加したいと思います。だから、最初の9文字までは問題ありませんが、9個以上になると、文字を格納するために配列のサイズを拡張する必要があります。だから私はこれを行うための最も簡単な方法は次のようにSTRCATを使用していたと思った:

char orig[] = "hello"; 
char temp[1]; 
temp[0] = ' '; 
strcat(orig, temp); 
temp[0] = 'w'; 
strcat(orig, temp); 
// etc 

文字列は、私はprintfの(ORIG)を行うときに、私は何を期待出力しますが、私はサイズを拡張していなかったので、私は心配していますprintf("%d", sizeof(orig))はまだ5であるが、tempsを追加することでより大きくなるはずだからだ。この問題を解決する最良の方法(簡単な方法)は何ですか?

+0

'のsizeof orig'は、最後の位置(' ORIG [5] ')でNUL終端バイト配列である6です。 – pmg

+1

また、 'char temp [1];'は決して使用可能な文字列ではありません。文字列であるためにはNUL終端バイトが必要ですが、1バイトのスペースしかないので空文字列にしかなりません。 – pmg

+0

GitHubには、['char_vector.h'](https://github.com/dtrebbien/lib_mysqludf_str/blob/master/char_vector.h)と[' char_vector.c'を参照してください。 ](https://github.com/dtrebbien/lib_mysqludf_str/blob/master/char_vector.c)。単に 'char'の動的配列を維持します。 –

答えて

3

origは静的に割り当てられているため、解放して再割り当てすることはできません。 sizeof(orig)は100で開始し、関係なく、それの中の文字列の長さは何、100で残っていないだろうと

char orig[100] = "hello"; 

注:しかし、あなたはこのように、追加の文字に合わせて、より多くのスペースを事前に割り当てることができます。その中のC文字列の現在の長さを調べるには、strlen(orig)を使います。

0

origのサイズを明示的に指定します。あなたのニーズに十分な大きさ(ish)の値が必要です。

char orig[1000] = "hello"; 

bestestの方法は、データを保持するだけの十分なメモリポインタと、malloc()の助けを借りて、realloc()、およびfree()使用を使用することです。しかしそれはもっと多くの仕事です。

0

文字列にメモリを割り当て(空き)する必要があります。 また、あなたのコードでは、サイズが4の空のC文字列を持っていません。また、strcatの場合は、文字列を保持するのに十分な領域を確保する必要があります。固定の6文字(hello + \ 0)

したがって良好

char const orig[] = "hello"; // The right hand side is not going to be changed so make the variable const 
char * result = malloc(strlen(orig) + 3); // 3 is one for each of the letters and one for the trailing \0 
strcpy(result, orig); // copies all of orig and the trailing \0 

strcat(result, " "); 
strcat(result, "w"); 

// extra work 

free(result); 
としてコードに
+0

Cの文字列リテラルは 'const'ではありません。しかし、それを変更しようとする未定義の振る舞いです。また、データは 'orig'にコピーされます。ポインタがconst chars: 'const char * ptr =" readonly ";'を指すようにすることは良い考えです。 – pmg