0

Cで2つの文字列を連結する場合、文字列ごとに追加のnull文字を割り当てる必要がありますか、それとも1つで十分ですか?

int main(){
    char *s1 = NULL;
    char *s2 = NULL;
    char *s1_s2 = NULL;

    s1 = malloc(sizeof(char) * strlen("string1") + 1);
    strcpy(s1, "string1");
    s2 = malloc(sizeof(char) * strlen("string2") + 1);
    strcpy(s2, "string2");

    s1_s2 = malloc(sizeof(char) * (strlen(s1) + strlen(s2)) + 2); // shouldn't it be only 1 null char ?
    strcpy(s1_s2, s1);
    strcat(s1_s2, s2);
}

この質問では、文字列ごとに2つのnullバイトを使用します。誰かが光を当てることができますか?ありがとう

4

5 に答える 5

3

いいえ、2 つの余分な null バイトは必要ありません。

メモリ内では、文字列は次のようになります。

s1 -> 's' 't' 'r' 'i' 'n' 'g' '1' '\0'

s2 -> 's' 't' 'r' 'i' 'n' 'g' '2' '\0'

s1_s2 -> 's' 't' 'r' 'i' 'n' 'g' '1' 's' 't' 'r' 'i' 'n' 'g' '2' '\0'
于 2012-01-24T11:55:54.707 に答える
2

必要なのは1つだけです。

あなたがリンクした質問では、彼らは実際には余分なバイトを必要とする余分なスペース文字も追加しています。

于 2012-01-24T11:54:26.617 に答える
1

最後の文字列はnullバイトで終わる必要があるため、1つで十分です。

編集:あなたが送った質問、2つの文字列の間にスペースがあります。

strcpy(both, first);
strcat(both, " ");
strcat(both, second);
于 2012-01-24T11:54:22.117 に答える
1

必要なのは1つだけです。文字列の最後に必要なヌル文字は常に1つだけです。これは、たまたま2つの文字列を連結したものです。

于 2012-01-24T11:54:27.947 に答える
1

リンク先の質問では、連結された文字列の間にスペースが挿入されています。このスペースには余分charに割り当てる必要があります。

あなたの例では、文字列の間にスペースを入れていないので、追加charする必要があるのは 1 つだけです。

于 2012-01-24T11:56:41.350 に答える