c - 如何正确使用 strncpy?
问题描述
我知道strncpy
是这里strcpy
所说的更安全的版本。
但是,当我想从 to 复制src
并且dst
不是dst
一个干净的缓冲区时,我会得到不需要的结果,可以通过以下方式避免strcpy
:
char *p = "123";
char a[10] = "aaaaaa";
strncpy(a,p,strlen(p));
printf("%s\n", a); // 123aaa
strcpy(a,p);
printf("%s\n", a); // 123 <- desired output, as the trailing a's are garbage
在我的实际情况下,我知道strlen(src) < sizeof(dst)
(至少,如果不是这样,程序会更快崩溃),所以我可以安全地strcpy
.
但是,如果strncpy
是我应该使用的,那么我必须在之后添加dst[strlen(src)] = '\0'
以避免垃圾(或者更好的是,事先初始化缓冲区?)?
解决方案
第三个参数strncpy
表示目标缓冲区的大小。并且当它填满它时,它不会按设计添加空终止字符。
如果你有足够的空间给终结者并且你坚持strncpy
,那就通过strlen(p) + 1
,这样它就不会认为它耗尽了目标缓冲区。
就像现在已经注意到的许多人一样。这种使用strncpy
违背了目的,实际上并不比简单地调用strcpy
. , 的唯一实际用途strncpy
是如果您想就地覆盖字符串的一部分(这是您偶然发现的用例)。虽然这也是有问题的用途......
推荐阅读
- r - 如何按班级制作频率表
- python - 使用二进制表示设计数据库
- flutter - Dart - 将 num 转换为 double
- c++ - 如何在 CMakeLists.txt 中正确设置 CMake 标志
- ruby-on-rails - Heroku Open 上的 Rails Heroku 应用程序错误
- android - Fiddler4 不捕获 Nox Android Emulator 流量
- unix - 如何grep(不)匹配每行末尾的特殊字符“/”(无引号)
- ios - 如何让 unwind segue 在同一个视图控制器中的常规 segue 之间工作?
- python - Python 的正则表达式 findall 不返回 Unicode 文本的所有匹配项
- php - 传递的参数 1 必须是提供者存储库中模型的实例