Strcmp()即使在相同字符串之间进行比较也会返回错误的值

strcmp() returns wrong value even when the comparison is between same strings

本文关键字:比较 返回 错误 之间 字符串 Strcmp      更新时间:2023-10-16
#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'