strncatを使って自分自身に連結

今頃気づいたこと

strcatは文字列を連結するC言語の標準関数。
でも、自分自身を連結することができない。。。

だから今までは、

int main(int argc, char **argv) {
	char str1[255] = "ABCDEFG";
	char tmp[255];

	strcpy(tmp, str1);
	strcat(str1, tmp);

	printf("%s\n", str1);

	return 0;
}

ってな感じでtmpに自分自身をコピーしてやっていた。

でも今日ふと気付いた。

int main(int argc, char **argv) {
	char str1[255] = "ABCDEFG";

	strncat(str1, str1, strlen(str1));

	printf("%s\n", str1);

	return 0;
}

でいいやん。。

strcatはs2の'\0'(ヌル文字)が来るまでコピーし続けるので多分こんな感じ

char *strcat(char *s1, const char *s2) {
	char *p;
	int i;

	for(p = s1; *p != '\0'; p++);
	for(i = 0; s2[i] != '\0'; i++, p++) {
		*p = s2[i];
	}
	*p = '\0';

	return s1;
}

になっている。s1とs2に同じポインタを指定すると、自分自身の末尾に文字をドンドン追加していくので永遠に終りが来ない。(エラー終了)

でもstrncats2の'\0'(ヌル文字)かn文字コピーするまで続けるので多分こんな感じ

char *strncat(char *s1, const char *s2, size_t n) {
	char *p;
	int i;

	for(p = s1; *p != '\0'; p++);
	for(i = 0; s2[i] != '\0' && i < n; i++, p++) {
		*p = s2[i];
	}
	*p = '\0';

	return s1;
}

になっている。だから呼び出しのときに指定した文字数が以前の文字数までコピーされて終了。

よって

strncatを使えば万事解決?
とりあえず、s1とs2に同じポインタが指定される可能性がある場合はstrncatを使おう!