Shammer's Philosophy

My private adversaria

文字列の連結

strcat という関数があると知ったので、早速試してみた。2 つの引数を取るようなので、戻り値が連結された文字になるのかなと思い、以下のように書いてみたが、Segmentation fault になってしまう。

#include <stdio.h>
#include <string.h>

int main(int argc, char* args[]){
    char* value1 = "abcdefg";
    char* value2 = "0123456789";
    char* value = strcat(value1, value2);
    printf("%s\n", value);
    return 0;
}

man で調べてみると、「 If dest is not large enough, program behavior is unpredictable;」とある。dest というのが第一引数。上の例だと、value1 が大きくないといけない。まったく新しい文字列を返すようなものがほしいのだが・・・これは自作しないとダメかもしれない。man で表示された strncat も自分の希望にあうものではなさそう。
と、言うわけで書いてみました。

#include <stdio.h>
#include <string.h>

int main(int argc, char* args[]){
    char* value1 = "abcdefg";
    char* value2 = "0123456789";

    int len_value1 = strlen(value1);
    int len_value2 = strlen(value2);
    
    int length = len_value1 + len_value2;
    char value[length];
    int i;
    for( i = 0 ; i < len_value1 ; i++ ){
	value[i] = value1[i];
    }
    for( i ; i < length ; i++ ){
	value[i] = value2[i - len_value1];
    }
    printf("%s\n", value);
    return 0;
}

関数にはなっていないけれども、とりあえず連結には成功。

$ gcc concatenate-sample.c 
$ ./a.out
abcdefg0123456789
$