我在比较两个相同的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);
它解决了这个问题,但我宁愿插入字符串的长度而不是自己获取它。
这里出了什么问题?我该如何解决这个问题?
答案 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)
strcopy
和strncpy
:在这种情况下,他们的行为完全相同!!
所以你没有告诉我们真相或整个情况(例如:字符串长度至少为49个字符)