【问题标题】:strcmp() returns wrong value even when the comparison is between same strings即使比较是在相同的字符串之间,strcmp() 也会返回错误的值
【发布时间】:2015-10-09 15:11:34
【问题描述】:
#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码。但是我现在该如何解决我的问题呢?

【问题讨论】:

  • 您可以使用x.at(n) == 'a' 来比较单个字符。
  • @NeilKirk 它说:int 和 char* 之间的比较无效
  • @NeilKirk 你是对的。我对char使用了双引号。 :(

标签: c++ string if-statement strcmp


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    当解释为 C 风格的字符串时,&amp;x.at(0) 实际上等同于 x.c_str():它们都返回指向字符串中第一个字符的指针。 strcmp 之类的函数对 C 风格的字符串进行操作,将通过读取直到第一个空字符来确定字符串的长度。

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

    您对第二个字符的测试当然有效,因为“B”后面紧跟着空分隔符。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-18
      • 2020-04-03
      • 1970-01-01
      • 2013-04-19
      相关资源
      最近更新 更多