strcmp() returns 错误值,即使在相同字符串之间进行比较也是如此

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,应该 return "midget boys" 但它一直落到 else 和 returns "invalid codeboys"。不知何故,第二个条件工作正常。我的诊断告诉我,在第一次比较时它 returns 66。我猜这是 "M" 的 ASCII 码。但是我现在该如何解决我的问题呢?

strcmp 期望比较两个以 null 结尾的字符串。它将开始比较每个字符串的第一个字符。如果它们彼此相等,则继续执行以下对,直到字符不同或到达终止空字符为止。

您想比较两个字符。试试这个:

if(x.at(0) == 'M')
...

当解释为 C 风格字符串时 &x.at(0) 实际上等同于 x.c_str():这两个 return 都是指向字符串中第一个字符的指针。像 strcmp 这样对 C 风格字符串进行操作的函数将通过读取直到第一个空字符来确定字符串长度。

因此,在您的示例中,您的第一个测试将 "MB" 与 "M" 进行比较。

您对第二个字符的测试当然有效,因为 "B" 后紧跟空定界符。

正如其他人已经说过的,您可以通过直接 char 比较来完成您需要的操作:x.at(0) == 'M'