如果您知道其局限性strncpy(),那就没关系.我避免它,因为我不喜欢它的局限性,这有两个方面:
这意味着如果你写:
char little[10];
char large[20480];
strncpy(little, sizeof(little), "abcdefghijklmnopqrstuvwxyz");
strncpy(large, sizeof(large), "abcdefghijklmnopqrstuvwxyz");
Run Code Online (Sandbox Code Playgroud)
然后little不是以空字符结尾的字符串,虽然没有发生缓冲区溢出,并且大的20454空值被复制到其尾端.两者都很麻烦.
strlcpy()和strlcat()可用iOS上; 它们在Mac OS X上.如果您使用C++进行编码,则根本不应该使用C字符串,或者仅在系统服务需要使用的最有限的情况下使用,然后您应该有一个带有C++字符串的封面函数(内联)并将somestring.c_str()值传递给系统服务.
如果您使用Objective-C进行编码,则将使用NS*字符串.
所以,只考虑strncpy()你是否在C编码.即使这样也要小心.
我有一篇论文(我并没有在其中提出任何新颖性 - 我从其他人那里收集了这个想法):
strcpy(),你只能使用strncpy(),strcat()和strncat()安全的函数)strncat()?(1)).strcpy(); 你可以使用memmove()(或memcpy()).(1)长度是在考虑当前字符串之后目标缓冲区中可用的空间.因此,为了能够使用strncat(),您必须知道字符串在目标字符串中的长度以及可用的总长度,以便您可以strncat()跳过字符串的初始段然后连接部分或全部第二个字符串.但是,如果您知道,您可以使用:
strncpy(target + curr_target_strlen, source, target_size - curr_target_strlen);
Run Code Online (Sandbox Code Playgroud)
这将是"更有效",因为它不涉及跳过字符串的前导部分(顺便说一句,如果您正在构建一个包含大量strncat()或strcat()操作的长字符串,则会导致二次行为).或者,鉴于您知道所有尺寸,您可以使用memmove():
size_t copy_length = target_size - curr_target_strlen;
if (copy_length > source_strlen)
copy_length = source_strlen + 1;
memmove(target + curr_target_strlen, source, copy_length);
Run Code Online (Sandbox Code Playgroud)
而且,除非我在一时冲动的代码中出现一个一个一个错误,否则会避免大多数问题strncat().如果你总是使用strncat()指向字符串末尾的null的第一个参数,它有它的用途(并且可以在汇编程序中进行优化.否则,它不是一个好的选择 - IMNSHO.
| 归档时间: |
|
| 查看次数: |
543 次 |
| 最近记录: |