添加长度时strncpy char字符串问题

时间:2012-03-22 19:46:05

标签: c++ strcmp strcpy strncpy

我在比较两个相同的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);

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

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

5 个答案:

答案 0 :(得分:2)

你忘了将终结NUL字符放到string,所以strcmp可能会在结尾处运行。使用以下代码行:

string[49] = '\0';

解决您的问题。

答案 1 :(得分:0)

使用strncpy

时,需要手动设置空终止符
strncpy(string, "StringToCompare", 48);
string[49] = 0;

答案 2 :(得分:0)

其他答案中有很多明显的猜测,但很快就有了建议。

首先,编写的代码应该可以工作(事实上,在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终止符不会被复制到临时字符串中。

我会在评论中回应使用std::string(如果有)的建议。它会为您完成所有这些工作,因此您可以专注于实施而不是这些细节。

答案 3 :(得分:0)

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

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

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

请注意,strncpy()已被弃用,而不是strncpy_s,它确实需要传递缓冲区长度:

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

答案 4 :(得分:-1)

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

所以你没有告诉我们真相或整个情况(例如:字符串长度至少为49个字符)