当它应该是字符串时输入接受char?

时间:2010-05-06 09:04:36

标签: c++ if-statement

我是C ++的新手,正在创建一个简单的文本RPG,无论如何,场景是我有一个选择1-3的“欢迎”屏幕,并有一个简单的IF语句来检查它们,在这里:

int choice;
std::cout << "--> ";
std::cin  >> choice;

if(choice == 1) {
//..

这样可以正常工作,但如果有人输入一个字母作为选择(而不是1,2或3),它将变成“-392493492”或其他东西并使程序崩溃。所以我想出了:

char choice;
std::cout << "--> ";
std::cin  >> choice;

if(choice == 1) {
//..

这种方法很好,但是当我输入一个数字时,它似乎完全跳过了IF语句。字符“1”是否与数字1相同?

我得到了一个编译器错误(ISO-CPP或其他东西):

if(choice == "1")

那么我怎么看他们是否正确输入了1-3?

6 个答案:

答案 0 :(得分:3)

1 is an int
'1' is a char
"1" is a char array

我想你想与'1'进行比较。

答案 1 :(得分:3)

选择不会变成“-392493492”或其他东西,它以该值开始(您没有初始化它,因此初始值未指定)并且永远不会设置为其他任何因为>>失败。您应该检查这些运算符是否成功,这很容易做到:

if (std::cin >> choice) {
    switch (choice) {
    case 1: // ...
    case 2: // ...
    case 2: // ...
    default: // report error
    }
}

答案 2 :(得分:2)

不幸的是1'1'不一样。

查找您最喜欢的ASCII表以了解代表字符“1”的整数值,您将自己看到它:'1'映射到49

此代码存在另一个问题""表示C字符串(const char*),而''表示单个字符。

以下是您的代码重做:

char choice = 0;
if (cin >> choice)  // check success
{
  switch(choice) // choose
  {
  case '1': {  /**/ break; }
  case '2': {  /**/ break; }
  case '3': {  /**/ break; }
  default:
    cout << choice
         << " is not a valid choice, please press 1, 2 or 3 and Enter"
         << endl;
  }
}

我切换到切换,因为它比通用枚举的else-if链更自然。

答案 3 :(得分:1)

if(choice == '1')

要回答你的问题,1的ascii值不等于1,但等于49:

'1' == 49

答案 4 :(得分:1)

双引号中的值被解释为字符串(类型为char*,与char不兼容),而在单引号中则被解释为char:

if(choice == '1')

char '1'的整数表示不是1,而是49(在ASCII中)。所以你也可以写

if(choice == 49)

此外,您应该有一个else分支来显示错误消息或其他内容,并阻止程序在输入无效输入时继续。

答案 5 :(得分:1)

choice是一个char,所以你应该使用'1'来检查。 “1”表示其中包含1个字符的字符串。