[英]C++/Arduino: strcpy(), strncpy() and memcpy() on unsigned char not working
[英]Is strncpy() a specialization of memcpy()?
只是想知道(因为我们经常使用这些功能)。 我看不出strncpy()和memcpy()之间有任何实际区别。 不值得这么有效地说,
char* strncpy (char *dst, const char *src, size_t size)
{
return (char*)memcpy(dst, src, size);
}
还是我错过了任何副作用? 之前有一个类似的问题,但找不到确切的答案。
有区别,请参阅您链接到的strncpy
页面的这一部分(强调我的):
将源的前 num 个字符复制到目标。 如果在复制 num 个字符之前找到源 C 字符串的结尾(由空字符表示),则用零填充目标,直到总共写入了 num 个字符。
因此,如果要复制的字符串短于限制,则strncpy
用零填充,而memcpy
读取超出限制(可能调用未定义的行为)。
不,它们不一样。
来自 C 标准 (ISO/IEC 9899:1999 (E))
7.21.2.3 strcpy function
描述
2 strncpy function 从 s2 指向的数组复制不超过 n 个字符(不复制 null 字符之后的字符)到 s1.260 指向的数组) 如果复制发生在重叠的对象之间,则行为是不明确的。
3 如果 s2 指向的数组是一个短于 n 个字符的字符串,则 null 字符将附加到 s1 指向的数组的副本中,直到 n 个字符全部写入。
退货
4 strncpy function 返回 s1 的值。
7.21.2.1 memcpy function
描述
2 memcpy function 将 n 个字符从 s2 指向的 object 复制到 s1 指向的 object 中。 如果复制发生在重叠的对象之间,则行为未定义。
返回 3 memcpy function 返回 s1 的值。
使用memcpy()
时,源缓冲区和目标缓冲区可以重叠,而在strncpy()
中则不能发生这种情况。
根据 C 标准,对于strncpy()
和memcpy()
,重叠缓冲区的行为都未定义。
根据 C 标准, strncpy()
和memcpy()
之间的真正区别在于,如果源字符串小于 N 值,则将 NULL 字符附加到剩余的 N 数量。
memcpy()
效率更高,但安全性较低,因为它不检查源以查看是否有 N 个数量可以移动到目标缓冲区。
不, strncpy()
不是专门化的,因为它会在复制过程中检测到'\0'
字符并停止,而memcpy()
不会这样做。
加上其他人所说的, src 和 dst 指针的类型并不重要。 也就是说,我可以将 4 字节 integer 复制到 1 字节的 4 个连续字符,如下所示:
int num = 5;
char arr[4];
memcpy(arr, &num, 4);
另一个区别是 memcpy 看起来没有任何字符(例如 NULL,由 strncpy 提供)。 它盲目地将 num 个字节从源复制到目标。
编辑:正确格式化代码
您可以通过检查 \0 并且不复制该点来使 strncpy 更快。 所以 memcpy 总是会复制所有数据,但 strncpy 通常会因为检查而更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.