どちらもstrncmp
見た目とはstrlcpy
異なり、私のオペレーティング システム (Linux) では利用できないことを知った後、自分で書いてみようと思いました。
libc のメンテナーである Ulrich Drepper からの引用を見つけましstrlcpy
たmempcpy
。どちらも持っていませんがmempcpy
、その動作は簡単に再現できました。まず、これは私が持っているテストケースです
#include <stdio.h>
#include <string.h>
#define BSIZE 10
void insp(const char* s, int n)
{
int i;
for (i = 0; i < n; i++)
printf("%c ", s[i]);
printf("\n");
for (i = 0; i < n; i++)
printf("%02X ", s[i]);
printf("\n");
return;
}
int copy_string(char *dest, const char *src, int n)
{
int r = strlen(memcpy(dest, src, n-1));
dest[r] = 0;
return r;
}
int main()
{
char b[BSIZE];
memset(b, 0, BSIZE);
printf("Buffer size is %d", BSIZE);
insp(b, BSIZE);
printf("\nFirst copy:\n");
copy_string(b, "First", BSIZE);
insp(b, BSIZE);
printf("b = '%s'\n", b);
printf("\nSecond copy:\n");
copy_string(b, "Second", BSIZE);
insp(b, BSIZE);
printf("b = '%s'\n", b);
return 0;
}
そして、これがその結果です:
Buffer size is 10
00 00 00 00 00 00 00 00 00 00
First copy:
F i r s t b =
46 69 72 73 74 00 62 20 3D 00
b = 'First'
Second copy:
S e c o n d
53 65 63 6F 6E 64 00 00 01 00
b = 'Second'
内部表現 (作成された行)には、最初のコピー後の検査でのフォーマット文字列や、2 番目のコピーでの外部の 0x01 など、insp()
ノイズが混入していることがわかります。printf()
文字列はそのままコピーされ、長すぎるソース文字列を正しく処理します (copy_string
ここでは、長さとして 0 を渡すことで発生する可能性のある問題を無視しましょう。後で修正します)。
しかし、宛先内に (フォーマット文字列からの) 外部配列の内容があるのはなぜですか? あたかも宛先が新しい長さに一致するように実際にサイズ変更されたかのようです。