char *与std string错误结果进行比较

时间:2012-02-13 09:09:49

标签: c++ linux

案例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!

4 个答案:

答案 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)。