怠日記

写真・金魚・昆虫・プログラミングの趣味を語るサイトです。似たようなことをnoteにも書いたり書いてなかったり。

C言語 - 文字列をコピーする | strcpy(), strncpy()

文字列をコピーするには strcpy() または strncpy() を使う。

文字列をコピーする

指定したバッファの位置に文字列をコピーする。

文字列の長さはチェックされないため、オーバーフローに気を付けること。

#include <string.h>
char *strcpy(char *dest, const char *src);

引数

  • dest
    コピー先の文字列バッファ

  • src
    コピーする文字列

戻り値

コピー先の文字列バッファ(dest)を指すポインタを返す。

char buf[16];

strcpy(buf, "Hello World!");
printf("%s\n", buf);
/* → Hello World! */
char buf[16] = "Hello";

strcpy(&buf[5], " World!");
printf("%s\n", buf);
/* → Hello World! */

&buf[5] は buf + 5 でも可。

指定した文字数分の文字列をコピーする

指定したバッファの位置に、指定した文字数分の文字列をコピーする。

strcpy() 同様、文字列の長さはチェックされないため、オーバーフローに気を付けること。

#include <string.h>
char *strncpy(char *dest, const char *src, size_t count);

引数

  • dest
    コピー先の文字列バッファ

  • src
    コピーする文字列

  • count
    コピーする文字数

count が src の文字列の長さ以下の場合、ヌル文字はコピーされない。
count が src の文字列の長さを超える場合、count の長さになるまでヌル文字がコピーされる。

戻り値

コピー先の文字列バッファ(dest)を指すポインタを返す。

コピーする文字列の長さを超える文字数を指定した場合、指定の文字数になるまでヌル文字で埋められる。

char buf[16] = "123456789012345";

strncpy(buf, "Hello World!", sizeof(buf) - 1);
printf("[%s]\n", buf);
printf("[%d]\n", strlen(buf));

コピーする文字列の長さ以下の文字数を指定した場合、ヌル文字は付与されない。

変数 buf に “Hello World!” の先頭から10文字をコピーすると指定した。

10 は “Hello World!” の長さ以下であるため、buf には “Hello Worl” がコピーされ、ヌル文字は付与されない。

★★★文字列として正しくない★★★

char buf[10];

strncpy(buf, "Hello World!", 10);
printf("[%s]\n", buf);
printf("[%d]\n", strlen(buf));

実行結果

ヌル文字で終わっていないため、buf の表示内容や strlen(buf) の結果が正しくない。

[Hello Worl〈SYN〉3&〈STX〉]
[16]

ではどうするか。

策①:なにがなんでも末尾をヌル文字にする

strncpy(buf, "Hello World!", sizeof(buf) - 1);
buf[sizeof(buf) - 1] = '\0';

策②:コピー先のバッファに格納できるときだけコピーする

if (strlen("Hello World!") < sizeof(buf)) {
    strcpy(buf, "Hello World!");
} else {
    /* TODO: バッファに収まらない場合の処理を書く */
}

ほかにもなにかあれば。