char*与std字符串的比较结果错误

char * compare with std string wrong result

本文关键字:比较 结果 错误 字符串 std char      更新时间:2023-10-16

情况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;}

RESULT:返回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;}

RESULT:返回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;}

RESULT:返回1//不正确

有人知道怎么了吗?thx!

strcmp需要两个以null结尾的字符串,但您没有向checkSum添加null终止符。

这就是为什么情况1返回1,而实际上它应该返回0。请注意,您的期望值不正确。在情况1中,一旦添加了null终止符,两个字符串应该比较为相等。因此strcmp将返回0,您的代码也应该返回0

对于情况2,strcmp("0A", "5A")返回负值,因为'0'<'5',所以您的代码应该返回0

对于情况3,strcmp("5A", "0A")返回一个正值,恰好正值是1,您错误地通过等式测试了它。

在所有情况下,测试1的值都是不正确的,因为strcmp从未承诺返回1。它承诺返回任一:

  • CCD_ 16的值以指示两个字符串相等
  • 指示CCD_ 17比较大于CCD_ 18的正值
  • 负值以指示CCD_ 19比较小于CCD_

因此,对strcmp的返回值的唯一有效比较是==0>0<0

您需要重新访问strcmp的文档,并纠正您对如何解释返回值的理解。

您的校验和包含未定义的数据-如果您没有在其中添加'\0'终止字符。如果您调用strcmp,则会出现意外行为。您可以将校验和声明为:char checkSum[9]={0};但更好的解决方案是避免不安全的字符数组,而是使用std::string。

strcmp返回值:

零值表示两个字符串相等。值更大大于零表示第一个不匹配的字符具有str1中的值大于str2中的值;并且值小于零表示相反

(摘录自http://www.cplusplus.com/reference/clibrary/cstring/strcmp/)

此外,您应该永远不要strcmp的结果与中除零之外的任何其他结果进行比较

strcmp(s1, s2) == 0
strcmp(s1, s2) > 0    
strcmp(s1, s2) < 0
strcmp(s1, s2) != 0

因为该标准在差异的情况下不奖励CCD_ 28(或CCD_。