【问题标题】:C++ comparing a char to a string literal [duplicate]C ++将char与字符串文字进行比较[重复]
【发布时间】:2013-02-07 05:06:21
【问题描述】:

这里是初学者...

我正在为我的计算机科学课程编写一个非常简单的程序,我遇到了一个我想进一步了解的问题。这是我的代码:

#include <iostream>

using namespace std;

int main(int argc, const char * argv[])
{
    char courseLevel;

    cout << "Will you be taking graduate or undergraduate level courses (enter 'U'"
            " for undergraduate,'G' for graduate.";
    cin >> courseLevel;

    if (courseLevel == "U")
    {
        cout << "You selected undergraduate level courses.";
    }

    return 0;
}

我的 if 语句收到两条错误消息: 1) 与字符串文字的比较结果未指定(使用 strncmp 代替)。 2)指针和整数的比较('int'和'const char*')。

我似乎已经通过将我的 U 用单引号括起来解决了这个问题,或者该程序至少可以正常工作。但是,正如我所说,我只是想了解我收到错误的原因,以便更好地了解我在做什么。

【问题讨论】:

  • 改用单引号。

标签: c++ char compare


【解决方案1】:

您需要改用单引号。

在 C 语言(和许多其他语言)中,character constant 是包含在单引号中的单个字符1

'U'

虽然string literal 是包含在双引号中的任意数量的字符:

"U"

您将 courseLevel 声明为单个字符:char courseLevel; 所以您只能将其与另一个单个 char 进行比较。

当您执行if (courseLevel == "U") 时,左侧是char,而右侧是const char* - 指针 指向该字符串文字中的第一个char。你的编译器告诉你这个:

指针和整数的比较('int'和'const char*')


所以你的选择是:

if (courseLevel == 'U')       // compare char to char

或者,例如:

if (courseLevel == "U"[0])    // compare char to first char in string

  1. 完整性说明:您可以拥有mulit-character constants

    int a = 'abcd'; // GCC 中的 0x61626364

但这肯定不是你要找的。​​p>

【讨论】:

  • 啊,这很简单。说得通。我没有意识到用引号括起来表示一个字符串,用单引号括起来表示一个字符。这就是我正在寻找的解释。谢谢!
  • 作为迂腐的,'abcd' 不是多字节字符常量。这是一个多字符文字L'a' 是一个多字节字符常量;它表示一个多字节字符,其类型为wchar_t
  • GCC 称它为“多字符常量”,我将其改为。
【解决方案2】:

Rapptz 是对的,但我认为进一步阐述应该会有所帮助...

courseLevel == "U"

在 C 和 C++ 中,双引号创建 字符串字面量 - 它是以数字 0 ASCII-NUL 终止标记字符结尾的字符数组,因此程序可以计算出文本结束的位置。所以,你基本上是在问一个字符是否等于一个字符数组......它们只是无法比较。有效的类似问题是:

  • 此字符变量是否保存特定字符值:courseLevel == 'U'
  • 此字符变量是否出现在特定数组中:strchr(courseLevel, "U")
  • 此字符变量是否匹配特定数组中的第一个元素:courseLevel == "U"[0]

当然,其中第一个是在您的程序中具有直观意义的那个。

【讨论】:

  • 感谢您详细说明。
  • 另外,一个很好的解释。谢谢!
【解决方案3】:

您收到错误的原因是因为 C 和 C++ 中的字符串文字以空终止字符 \0 结尾,而单个字符则没有。因此,当您将 char 与字符串文字进行比较时,您会将字符文字与字符数组 {'U','\0'} 进行比较。

【讨论】:

  • 如果你这么说。对不起,我猜。
  • +1 这是相关背景
  • @JonathonReinhart 我真的不知道该编辑什么,抱歉:(
  • @JonathonReinhart:“为了论证,我们正在处理 $ 终止的 DOS 字符串” - 不相关,因为问题显然是关于 C 字符串文字,它总是 NUL 终止 - Rapptz 甚至在他的回答中重申了这一背景。 (严格来说,他不是在比较“指向该数组的指针”......在解决比较时会尝试数组到指针的转换(并且失败),但 rhs 类型绝对是字符数组。)跨度>
  • @JonathonReinhart:虽然这仍然不正确...考虑在 C++ 中 template &lt;size_t N&gt; void f(const char (&amp;)[N]) { ... } 可以用字符数组调用 - 这是一个函数参数的示例,其中数组不是通过指针传递的.同样,用户定义类型的operator== 不必依赖数组到指针的标准转换。无论如何,我不打算进一步争论——我已经仔细阅读了标准的那部分内容,如果你在乎的话,你也会这样做。
猜你喜欢
  • 2022-12-04
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多