1. ホーム
  2. c

[解決済み] 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;
}

もし、文字列を多用するのであれば、文字列を第一級にサポートする別の言語を使用した方がよいかもしれません。