Strcmp()即使在相同字符串之间进行比较也会返回错误的值
strcmp() returns wrong value even when the comparison is between same strings
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main()
{
string x;
cin>>x;
if(strcmp(&x.at(0), "M") == 0)
{
cout<<"midget ";
}
else if(strcmp(&x.at(0), "J") == 0)
{
cout<<"junior ";
}
else if(strcmp(&x.at(0), "S") == 0)
{
cout<<"senior ";
}
else
{
cout<<"invalid code";
}
if(strcmp(&x.at(1), "B") == 0)
{
cout<<"boys";
}
else
{
cout<<"girls";
}
return 0;
}
我已经使用上面的代码来比较MB,它应该返回"侏儒男孩",但它一直下降到else并返回"无效码童"。不知怎的,第二种情况很好。我的诊断告诉我,在第一次比较时它返回66
。我猜这是"M"的ASCII码。但是我现在怎么解决我的问题呢?
strcmp期望比较两个以空结尾的字符串。它将开始比较每个字符串的第一个字符。如果它们彼此相等,则继续执行后面的对,直到两个字符不相同或到达终止的空字符为止。
要比较两个字符。试试这个:
if(x.at(0) == 'M')
...
当被解释为c风格字符串时,&x.at(0)
实际上相当于x.c_str()
:它们都返回指向字符串中第一个字符的指针。像strcmp
这样操作c风格字符串的函数将通过读取直到第一个空字符来确定字符串长度。
因此,在您的示例中,您的第一个测试将"MB"与"M"进行比较。
对第二个字符的测试当然有效,因为"B"后面紧跟着空分隔符。
正如其他人已经说过的,您可以通过直接比较char
来做您需要的事情:x.at(0) == 'M'
相关文章:
- C++ - 负数和正数之间的比较返回 false
- 无法将返回的枚举与枚举进行比较
- 在C++中返回基元类型数组(Java比较)
- 比较 C++ 中的两个数组,并根据元素的匹配或不匹配返回值
- 如何在C++中比较 lambda 函数的返回类型?
- C++函数来返回基于参数的比较器通用映射类型?
- 为什么比较运算符"=="返回"YES"即使两个向量不同?
- 为什么当 std::sort 中的比较函数始终返回 true 时出现运行时错误
- 当参数相等时,为什么必须std :: sort比较函数返回false
- 比较字符总是返回的
- 在比较过程中返回节点信息
- 在C++中返回一个比较的字符指针数组
- 比较/计数非零返回比预期更大的值
- 优先级队列自定义比较器的返回值表示什么
- 常量字符* if() 与 "SRAD" 的比较返回 false
- 与返回 false 的 fmod() 结果进行比较
- C++字符串比较返回0,但布尔值返回false
- C++比较运算符未返回true或false
- 比较函数使用重载运算符返回不正确的结果
- 字符串比较返回值(Is用于对字符进行排序的应用程序?)