c++ - strncpy 没有按预期工作

标签 c++ string strncpy

#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/

相关文章:

c - 用零填充 C-Array,然后将数据复制到其中

arrays - 使用 strncpy() 时缓冲区溢出内存困惑?

c++ - 模板 char/wchar_t、string/wstring、cout/wcout、regexp/wregex(或任何可能的解决方法)

c++ - 链接器错误 LNK1120 和 LNK2001

c++ - 数据文件处理

javascript - Javascript string.toLowerCase() 在大小写转换中是否遵循 Unicode 标准?

c - 当我比较 C 中完全相同的字符串时,strcmp() 返回 10

java - 如何从字符串中解析出字符?

c - strlen 没有产生正确的数字并且 strncpy 不起作用

C++通过类模板函数中的指针访问类方法