【问题标题】:C++ comparing a char to a string literal [duplicate]C++ 将 char 与字符串文字进行比较 [重复]
【发布时间】:2022-12-04 15:59:43
【问题描述】:

初级程序员在这里...

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

#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* -- a指针到该字符串文字中的第一个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

    但这肯定不是您要找的。

【讨论】:

  • 啊,这很简单。说得通。我没有意识到用引号括起来的东西表示一个字符串,用单引号括起来的东西表示一个字符。这就是我要找的解释。谢谢!
  • 迂腐,'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++ 中的字符串文字以空终止字符 结尾

猜你喜欢
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多