在缓冲区之间移动字符串时,我经常将char*视为数据缓冲区,而不使用字符串缓冲区(strncpy、strncat等)。示例:
memcpy(target, src, strlen(src) + 1) // after buffer size checks
//vs
strncpy(target, src, target_size - 1);
target[target_size - 1] = 0;这是个糟糕的做法吗?
编辑:我知道不同之处,这不是重复,而是一个标准实践的问题。
发布于 2016-07-07 21:08:25
如果您知道语义和大小,这不是一个问题。请记住,strncpy将在第一个null处停止,如果字符串较短(如果源中没有空字节,它将不会写入空字节)。strncpy还可以为您提供一些更好的排版功能,因为它期望在所有情况下都使用char *,而不是void *。
更有效的方法值得商榷,但是基于CPU批量指令(可以在一条指令中复制整个内存块),memcpy可能更快,因为strncpy会检查每个复制的字节是否有一个NUL字符。
发布于 2016-07-07 21:07:36
使用
memcpy(target, src, strlen(src) + 1) // after buffer size checks可能涉及遍历字符串两次--一次在strlen中,一次在memcpy中。如果使用strcpy,就会受到一些小的性能影响。
如果出于不相关的原因计算字符串的长度,或者使用来自其他资源的字符串长度,我不清楚memcpy比strncpy更好还是更差。
如果由于其他原因没有计算字符串的长度,或者没有来自其他资源的字符串长度,最好使用strcpy而不是memcpy或strncpy。
https://stackoverflow.com/questions/38255212
复制相似问题