文字列をコピーするには 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: バッファに収まらない場合の処理を書く */
}ほかにもなにかあれば。