【问题标题】:C++ received char for integer type cause switch case went wrongC++ 收到整数类型的 char 导致 switch case 出错
【发布时间】:2018-08-02 10:33:54
【问题描述】:

我正在尝试编写一个简单的程序,提示用户输入一个数字,然后它会回复用户输入的数字键。除 0~9 以外的输入应该转到默认情况下“不允许。”消息将作为输出打印。以下代码:

#include <iostream>
#include<cstdio>

using namespace std;

int main()
{ 
    int x;
    cout << "Please enter number from 0~9: ";
    cin >>x;
    switch (x)
    {
    case 0: cout<< "0 is pressed.";break;
    case 1: cout<< "1 is pressed.";break;
    case 2: cout<< "2 is pressed.";break;
    case 3: cout<< "3 is pressed.";break;
    case 4: cout<< "4 is pressed.";break;
    case 5: cout<< "5 is pressed.";break;
    case 6: cout<< "6 is pressed.";break;
    case 7: cout<< "7 is pressed.";break;
    case 8: cout<< "8 is pressed.";break;
    case 9: cout<< "9 is pressed.";break;
    default : cout << "Not allowed.";
    }
    return 0;
}

因此,当我尝试输入非整数,例如“a”或“abc”时,它将在 case 0 中运行语句,而不是 case default。谁能解释为什么?不是当一个整数变量试图存储一个字符时,它会把它的 ascii 作为它的值吗?希望有人愿意解释这背后的逻辑。谢谢!

(我目前正在使用getchar()并将变量x声明为char数据类型,以及case '0'等来暂时解决这个问题。但我自己很感兴趣学习这方面的知识。对不起如果这样的帖子是重复的,我尝试搜索并没有找到。希望我的搜索技术不要那么糟糕。)

【问题讨论】:

  • 不,当“一个整数变量试图存储一个字符”时,它不会“把它的 ascii 作为它的值”。 &lt;&lt; 不是这样工作的。但是你仍然需要default:,以防有人输入“42”作为输入,例如。您只需要添加一些代码来检查无效输入。

标签: c++ char int switch-statement


【解决方案1】:

这是在c++11 中引入的,如果std::cin 提取失败xzero initialised

如果提取失败,则将零写入值并设置失败位。如果 提取导致值太大或太小而无法适应 值,std::numeric_limits::max() 或 std::numeric_limits::min() 已写入并设置了故障位标志。

显然在需要数字时提供字母会导致提取失败。

如果您没有使用c++11 及以上,那么x 的值就是操作前的值。

您可以通过阅读char 来纠正此问题,并将其与char 进行比较:

char x;
cout << "Please enter number from 0~9: ";
cin >> x;
switch (x)
{
    case '0': cout << "0 is pressed."; break;
    case '1': cout << "1 is pressed."; break;
    //..the rest of cases..//
    default: cout << "Not allowed.";
}

或者,您可以处理提取失败并清除std::cin,然后再次提示用户:

#include <iostream>
#include <limits>

int main()
{
    int x;
    while (true)
    {
        std::cout << "Please enter 1, 22 or 155: ";
        if (std::cin >> x)
            break;

        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }

    switch (x)
    {
        case 1: std::cout << "1 is entered\n"; break;
        case 22: std::cout << "22 is entered\n"; break;
        case 155: std::cout << "155 is entered\n"; break;
        default: std::cout << x << " is not an option, good bye!\n";
    }

    return 0;
}

【讨论】:

  • 感谢您的解释!现在我知道这是如何以及为什么会发生的!
  • 更好的解决方法是检查cin 的状态:如果它处于失败状态,则执行默认处理。无论如何,您都需要检查这个以重置状态并继续输入,除非程序在这种情况下退出
  • @M.M 当然可以
【解决方案2】:

让我试着分解一下:

int x; // will store 0 in x as it is the default value of int
cout << "Please enter number from 0~9: ";
cin >>x; // if you input a string this will fail, and cin should be in an error state, 
         // and the value of x is unchanged
switch (x)
{
  case 0: cout<< "0 is pressed.";break; //< x is 0
  ...

您应该检查 cin 是否有错误以处理字符串:

if (cin.fail()) {
  //handle error
  cin.clear() // reset cin error flags
}

【讨论】:

  • int x 是非类局部变量,它不是静态的或线程局部的,因此它被初始化为不确定的值,恰好是 0 这里。
  • 如果输入格式不正确,@DanM cin &gt;&gt; xx 设置为 0。 (但如果根本无法读取任何字符,它会使x 保持不变,因此代码仍然存在错误,应该初始化x)。
【解决方案3】:

一旦不同类型的数据输入“cin”,它就会采用该类型的默认值。

int x;
cout << "Please enter number from 0~9: ";
cin >>x;

输入是字符串,它返回0作为int x的默认值。

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 2023-03-10
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多