C言語でconst/literal文字列を連結するにはどうすればよいですか?
C言語で仕事をしているのですが、いくつかのものを連結しなければなりません。
今のところ、次のようなものがあります。
message = strcat("TEXT ", var);
message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));
さて、C言語の経験がある方なら、これを実行しようとするとsegmentation faultが発生することに気づくと思います。では、どうやってそれを回避すればいいのでしょうか?
321
3
C言語では、"string"は単なる
char
配列です。そのため、他の"string"と直接連結することはできません。これは、
src
が指す文字列をdest
が指す文字列の末尾に追加するものです。以下はcplusplus.comの例である。
最初のパラメータには,デスティネーション・バッファそのものを指定する必要があります. デスティネーションバッファは、char配列バッファでなければなりません。 例を挙げると
char buffer[1024];
**最初のパラメータには、コピーしようとしているものを保存するのに十分なスペースがあることを確認してください。 もし利用可能であれば、以下のような関数を使用すると安全です。もし使用可能であれば、次のような関数を使用した方が安全です:
strcpy_s
やstrcat_s
のように、コピー先のバッファのサイズを明示的に指定しなければなりません。Note:文字列リテラルは定数であるため,バッファとして使用することはできません。文字列リテラルは定数なので,バッファとして使用することはできません.したがって,バッファ用の char 配列を常に確保する必要があります.
strcat`の戻り値は,単に無視しても構いません。これは利便性のために存在するもので,呼び出しを一行のコードにまとめることができます。
つまり、あなたの問題は次のように解決できます。
文字列リテラルを変更しようとするのは未定義の動作で、以下のようになります。
のようなものがそれにあたります。これは、文字列リテラル
"Hello, "
の末尾にname
という文字列を追加しようとするもので、これは十分に定義されていません。次のようにしてみてください。これであなたがやろうとしていることが実現できます。
これは、変更が許可されている*バッファ領域を作成して、文字列リテラルと他のテキストの両方をそこにコピーします。ただ、バッファオーバーフローには注意が必要です。入力データを制御する(または事前にチェックする)場合は、私のように固定長のバッファを使っても問題ありません。
そうでない場合は、ヒープから十分なメモリを確保して処理できるようにするなどの緩和策をとるべきです。つまり、次のようなことです。
strcat()の第一引数には、連結された文字列のための十分なスペースを確保する必要があります。そこで、結果を受け取るのに十分なスペースを持つバッファを割り当てます。
strcat()は第2引数と第1引数を連結し、その結果を第1引数に格納します。返されるchar*は単にこの第1引数であり、あなたの便宜のためだけのものです。
第1引数と第2引数を連結して新たに確保された文字列は得られませんが、これはあなたのコードに基づいて期待していたことだと思います。