【发布时间】:2016-12-08 17:20:10
【问题描述】:
我正在阅读this 文件,上面写着:
char *strncpy(char *destination, const char *source, size_t num);从字符串中复制字符 将
source的第一个num字符复制到destination。如果在复制num字符之前找到sourceC 字符串的结尾(由空字符表示),则用零填充destination,直到总共写入num字符它。如果源长于
num,则不会在目标末尾隐式附加空字符。因此,在这种情况下,destination不应被视为以 null 结尾的 C 字符串(这样读取它会溢出)。
destination和source不得重叠(重叠时请参阅memmove以获得更安全的替代方案)。
但我对这种说法感到困惑:
在这种情况下,目的地不应被视为以空结尾的 C 字符串(这样读取会溢出)
既然num > strlen(source)会在最后填充'\0',那么'\0'实际上是字符串中的一个空(终止)字符,为什么不能认为它是一个空终止的C字符串呢?
我已经写了下面的代码来验证:
char from[] = { 'h', 'e', 'l', 'l', 'o', '\0' };
char to[1024];
for (int i = 0; i < 1024; i++) {
to[i] = 'e';
}
strncpy(to, from, 1024);
printf("from %s\n", from);
下面的输出效果很好:
from hello
to hello
【问题讨论】:
-
strncpy:别用就行了。 -
缺少
'\0'是strlen(source) > num,所以我认为您只是有一个简单的误解 - 请尝试使用strncpy(to, from, 2);。