案例1:
std::string dd = "5A"
char checkSum[9]
checkSum[0] = '5';
checkSum[1] = 'A';
if(strcmp(dd.c_str(),checkSum) == 1){
return 1;
}
else {return 0;}
结果:返回1 //正确!
案例2:
std::string dd = "0A"
char checkSum[9];
checkSum[0] = '5';
checkSum[1] = 'A';
if(strcmp(dd.c_str(),checkSum) == 1){
return 1;
}
else {return 0;}
结果:返回0 //正确!
案例3:
std::string dd = "5A"
char checkSum[9]
checkSum[0] = '0';
checkSum[1] = 'A';
if(strcmp(dd.c_str(),checkSum) == 1){
return 1;
}
else {return 0;}
结果:返回1 //不正确!
任何人都知道什么是错的? THX!
答案 0 :(得分:7)
strcmp
需要两个以空字符结尾的字符串,但您没有向checkSum
添加空终止符。
这就是案例1返回1
的原因,实际上它应该返回0
。请注意,您的预期值不正确。在情况1中,一旦添加了null终止符,两个字符串应该相等。因此strcmp
将返回0
,您的代码也应返回0
。
对于案例2,strcmp("0A", "5A")
会返回自'0'<'5'
以来的负值,因此您的代码应返回0
。
对于案例3,strcmp("5A", "0A")
返回一个正值,恰好正值为1
,您错误地通过相等性进行测试。
在所有情况下,测试1
的值都不正确,因为strcmp
永远不会返回1
。它有望返回:
0
表示两个字符串相等,或str1
比较大于str2
或str1
的比较小于str2
。 strcmp
的返回值唯一有效的比较是==0
,>0
或<0
。
您需要重新访问strcmp
的文档,并更正您对如何解释返回值的理解。
答案 1 :(得分:1)
您的校验和包含未定义的数据,您不会在其中添加'\ 0'终止字符。如果你调用strcmp,这是意外的行为。您可以将校验和声明为: char checkSum [9] = {0}; 但更好的解决方案是避免使用不安全的字符数组,而是使用std :: string。
答案 2 :(得分:0)
strcmp
返回值:
零值表示两个字符串相等。值更大 比零表示第一个不匹配的字符有一个 str1中的值大于str2中的值;值小于零 表示相反。
(摘自http://www.cplusplus.com/reference/clibrary/cstring/strcmp/)
答案 3 :(得分:0)
此外,您永远不会将strcmp
的结果与其他任何内容进行比较,然后将其与
strcmp(s1, s2) == 0
strcmp(s1, s2) > 0
strcmp(s1, s2) < 0
strcmp(s1, s2) != 0
因为标准在差异的情况下不会保证1
(或-1
)。