【问题标题】:strncpy char string issue when adding length添加长度时的strncpy char字符串问题
【发布时间】:2012-04-07 10:25:22
【问题描述】:

我在比较两个相同的 char 字符串时遇到问题:

char string[50];

strncpy(string, "StringToCompare", 49);

if( !strcmp("StringToCompare", string) )
//do stuff
else
//the code runs into here even tho both strings are the same...this is what the problem is.

如果我使用:

strcpy(string, "StringToCompare");

代替:

strncpy(string, "StringToCompare", 49);

它解决了问题,但我宁愿插入字符串的长度而不是它自己获取它。

这里出了什么问题?我该如何解决这个问题?

【问题讨论】:

  • 错误的是你使用的是 c 字符串,而不是 std::string
  • “现实世界”中的字符串是否有可能是 49 个字符?
  • @VJovic 是什么让您如此确定 STL 在他的目标平台上可用?还是说不使用 STL 是他的决定?
  • @JamesMcLaughlin:首先,您可能在谈论 C++ 标准库,而不是 STL,它们是独立的库。其次,您知道 std::string 的任何非跨平台实现吗?它所需要的只是内存分配器,那么为什么它会依赖于平台呢?最后,为什么有人会避免使用 C++ 标准库并使用过时的 C 函数? 最好回到 C,因为 C++ 不再是“带类的 C”。
  • @Griwes 告诉 C 程序员 C 函数“已过时”...

标签: c++ strcmp strcpy strncpy


【解决方案1】:

您忘记在string 中添加一个终止 NUL 字符,所以 strcmp 可能会跑到最后。使用这行代码:

string[49] = '\0';

解决您的问题。

【讨论】:

  • 这可能是他真实示例中的问题,但不是他发布的测试用例。来自 Linux 手册页:“如果 src 的长度小于 nstrncpy() 用空字节填充 dest 的其余部分。”
【解决方案2】:

使用strncpy时需要手动设置空终止符:

strncpy(string, "StringToCompare", 48);
string[49] = 0;

【讨论】:

  • 仅当字符串太长时。
【解决方案3】:

其他答案中有很多明显的猜测,但是一个快速的建议。

首先,编写的代码应该可以工作(事实上,在 Visual Studio 2010 中确实可以工作)。关键在于'strncpy' 的详细信息——除非源长度小于目标长度(在这种情况下),否则它不会隐式添加null 终止字符。另一方面,strcpy 在所有情况下都包含null 终止符,这表明您的编译器没有正确处理strncpy 函数。

因此,如果这在您的编译器上不起作用,您应该像这样初始化临时缓冲区:

char string[50] = {0}; // initializes all the characters to 0

// below should be 50, as that is the number of 
// characters available in the string (not 49).
strncpy(string, "StringToCompare", 50);

但是,我怀疑这可能只是一个示例,在现实世界中,您的源字符串是 49 个(同样,在这种情况下,您应该将 50 个传递给strncpy)字符或更长,在这种情况下,NULL 终止符是不会被复制到您的临时字符串中。

如果可用,我会回应 cmets 中使用 std::string 的建议。它会为您处理所有这些,因此您可以专注于您的实施,而不是这些陈腐的细节。

【讨论】:

    【解决方案4】:

    strncpy 中的字节数参数告诉函数要复制多少字节,而不是字符缓冲区的长度。

    因此,在您的情况下,您要求将常量字符串中的 49 个字节复制到缓冲区中,我认为这不是您的意图!

    但是,它不能解释为什么您会得到异常结果。你用的是什么编译器?当我在 VS2005 下运行此代码时,我得到了正确的行为。

    请注意 strncpy() 已被弃用,取而代之的是 strncpy_s,后者确实希望将缓冲区长度传递给它:

    strncpy_s (string,sizeof(string),"StringToCompare",49)
    

    【讨论】:

    • 检查strncpy的文档...If count is greater than the length of strSource, the destination string is padded with null characters up to length count....也就是说它不会复制到“StringToCompare”超过sizeof(“StringToCompare”)...+1 for强调strncpy_s
    【解决方案5】:

    strcopystrncpy:在这种情况下,它们的行为相同!!

    所以你没有告诉我们真相或全貌(例如:字符串至少有 49 个字符长)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多