我正在尝试编写一个简单的程序,提示用户输入数字,然后它将回复用户输入了哪个数字键。除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'等,以暂时解决此问题。但是我自己对学习有关这一知识很感兴趣。如果这样的帖子重复了,我试图搜索却没有找到。希望我的搜索技术没有那么糟糕。)
答案 0 :(得分:1)
如果c++11
提取失败std::cin
为zero 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的默认值。