[解決済み] C言語で2つの文字列を連結する方法は?
2022-04-24 06:29:59
質問
2つの文字列を足すにはどうしたらいいですか?
試しに
name = "derp" + "herp";
が、エラーになりました。
式はintegralまたはenum型でなければなりません
どのように解決するのですか?
C言語には、他の言語にあるような文字列のサポートはありません。Cの文字列は、単なる
char
最初のヌル文字で終端します。C言語には文字列の連結演算子はありません。
使用方法
strcat
を使って2つの文字列を連結します。次のような関数でできます。
#include <stdlib.h>
#include <string.h>
char* concat(const char *s1, const char *s2)
{
char *result = malloc(strlen(s1) + strlen(s2) + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
strcpy(result, s1);
strcat(result, s2);
return result;
}
これは最速の方法ではないですが、今はそのことを気にする必要はありません。この関数は、ヒープに割り当てられたメモリのブロックを呼び出し元に返し、そのメモリの所有権を渡していることに注意してください。呼び出す側の責任として
free
が不要になったら、そのメモリは破棄されます。
このように関数を呼び出します。
char* s = concat("derp", "herp");
// do things with s
free(s); // deallocate the string
もし、パフォーマンスを気にするのであれば、ヌルターミネータを探すために入力バッファを何度もスキャンするのは避けたいところでしょう。
char* concat(const char *s1, const char *s2)
{
const size_t len1 = strlen(s1);
const size_t len2 = strlen(s2);
char *result = malloc(len1 + len2 + 1); // +1 for the null-terminator
// in real code you would check for errors in malloc here
memcpy(result, s1, len1);
memcpy(result + len1, s2, len2 + 1); // +1 to copy the null-terminator
return result;
}
もし、文字列を多用するのであれば、文字列を第一級にサポートする別の言語を使用した方がよいかもしれません。
関連
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] JavaScriptで複数行の文字列を作成する
-
[解決済み] C#で文字列のエンコーディングを手動で指定せずに、一貫性のあるバイト表現を得るには?
-
[解決済み] と'is'のどちらかを使って文字列を比較すると、異なる結果になることがあるのはなぜですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] munmap_chunk(): 無効なポインタ
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] CコードでEOFを表現する?
-
[解決済み] C言語の**はどういう意味ですか?
-
[解決済み] C - Setデータ構造を実装するには?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?