#include <iostream>
using namespace std
#include <string.h>
int main(){
char token[] = "some random string";
char c[23];
strcpy( c, token);
strncpy(c, token, 5);
c[strlen(c)] = '\0';
cout<<c;
return 0 ;
}
我的输出是:一些随机字符串
。但我希望它是:一些
。任何人都可以解释为什么它会这样吗?
最佳答案
它工作得很好——记住 strncpy
does not necessarily null-terminate the string .当您这样做时:
strncpy(c, token, 5);
它将 token
的前 5 个字节复制到 c
但不会以 null 终止结果。此外,这一行是无用的:
c[strlen(c)] = '\0';
strlen(c)
查找现有的空终止符,一旦找到,就用另一个空终止符覆盖它,这是毫无意义的。
在新代码中,strncpy
应该很少,如果有的话被使用。它的预期用途(不一定以 null 结尾的固定长度缓冲区)早已被废弃。更喜欢像 strlcpy
这样的函数(注意:strlcpy
不是标准的;它仅在类 BSD 系统中可用)。
或者,如果您使用 C++ 而不是纯 C 进行编码,只需使用 std::string
并完全避免此类棘手的问题。
关于c++ - strncpy 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027510/