C ++收到用于整数类型的字符,导致开关大小写错误

时间:2018-08-02 10:33:54

标签: c++ char int switch-statement

我正在尝试编写一个简单的程序,提示用户输入数字,然后它将回复用户输入了哪个数字键。除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”)时,它将在情况0而不是默认情况下运行该语句。谁能解释为什么?当整数变量尝试存储字符时,不是将其ascii作为其值吗?希望有人愿意解释其背后的逻辑。谢谢!

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

3 个答案:

答案 0 :(得分:1)

如果c++11提取失败std::cinzero initialised,则会在x中引入。

  

如果提取失败,则将零写入值并设置故障位。如果   提取导致该值太大或太小而无法容纳   值,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;
}

答案 1 :(得分:0)

让我尝试将其分解:

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
}

答案 2 :(得分:0)

一旦在“ cin”中输入了不同类型的数据,它将使用该类型的默认值。

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

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