char*与std字符串的比较结果错误
char * compare with std string wrong result
情况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_。
- 为什么组合的上限和下限比较的计算结果总是为 true?
- 使用类似的比较函数时,在 c++ 中为 std:sort 获得不同的结果
- 比较整数提升后的结果
- C++:比较运算符>和字符串文本的意外结果
- yaml-cpp 比较的意外结果
- 我可以将比较结果用作C++的整数吗?
- 简单的程序比较阵列运行但给出不正确的结果
- 如何通过键和值以及在C 中的结果映射中比较两个地图?我们有任何STL API吗?
- 如何比较 C++ 和 MATLAB 之间的结果
- 在尝试提交作业警告时,我一直在警告:与未指定行为的字符串字面结果比较[-WADDRESS]
- 在将数组与字符数组进行比较后需要帮助输出一次结果
- 比较CPP和Python上的程序结果
- std::具有自定义比较函数结果的排序函数错误:必须调用对非静态成员函数的引用
- 不等式比较结果 移至 C++11 时未使用的警告
- C/C++:正在使用比较结果作为int真正的无分支
- char*与std字符串的比较结果错误
- 是否有可能判断哪个数组元素比较结果为真?
- 为什么unsigned long和负数比较结果是false ?
- 如何用二元运算符的比较结果来解释条件
- 按位操作比较结果错误