大多数有某种用户界面的程序需要处理用户输入。在项目中,你一直在写,你一直在使用std::cin要求用户输入文本输入。因为文本输入是自由格式的(用户可以输入任何东西),所以用户很容易输入不期望的输入。
在编写程序时,应始终考虑用户将如何(无意或以其他方式)滥用程序。一个写得很好的程序会预见用户会如何滥用它,或者是优雅地处理这些情况,或者防止它们发生在第一位(如果可能的话)。一个程序,处理错误的情况下,据说是强大的。
在这节课中,我们来看看具体的办法,用户可以通过标准输入无效的文本输入::CIN,并告诉你一些不同的方式来处理这些情况。
std::cin,缓冲,和提取
为了探讨std::cin和运算符> >可以失败,它首先有助于了解它们是如何工作的一点点。
当我们使用运算符来获取用户输入并将其输入变量时,这称为“提取”。运算符在此上下文中使用,因此称为提取运算符。
当用户输入响应提取操作输入,数据被放置在一个缓冲区::性病在CIN。缓冲区(也称为数据缓冲区)仅仅是一块内存,用来暂时存储数据,而它是从一个地方移动到另一个地方的。在这种情况下,缓冲区被用来保存用户输入,而它等待被提取到变量。
在这种情况下,我们要求用户输入四个符号中的一个,但他们输入了“k”代替。“K”是一个有效的字符,因此std::cin愉快地提取它变量运算,这会返回到主。但我们的程序不希望这种情况发生,所以它不妥善处理这种情况下(因此从来没有输出任何东西)。
这里的解决办法很简单:做输入验证。这通常包括3个步骤:
1)检查用户输入是否是你所期望的。
2)如果是这样,返回值给用户。
3)如果没有,告诉用户出错了,让他们再试一次。
这是一个更新的getoperator()功能,并输入验证。
在编写程序时,应始终考虑用户将如何(无意或以其他方式)滥用程序。一个写得很好的程序会预见用户会如何滥用它,或者是优雅地处理这些情况,或者防止它们发生在第一位(如果可能的话)。一个程序,处理错误的情况下,据说是强大的。
在这节课中,我们来看看具体的办法,用户可以通过标准输入无效的文本输入::CIN,并告诉你一些不同的方式来处理这些情况。
std::cin,缓冲,和提取
为了探讨std::cin和运算符> >可以失败,它首先有助于了解它们是如何工作的一点点。
当我们使用运算符来获取用户输入并将其输入变量时,这称为“提取”。运算符在此上下文中使用,因此称为提取运算符。
当用户输入响应提取操作输入,数据被放置在一个缓冲区::性病在CIN。缓冲区(也称为数据缓冲区)仅仅是一块内存,用来暂时存储数据,而它是从一个地方移动到另一个地方的。在这种情况下,缓冲区被用来保存用户输入,而它等待被提取到变量。
使用提取运算符时,会发生下列过程:
#include <iostream>
double getDouble()
{
std::cout << "Enter a double value: ";
double x;
std::cin >> x;
return x;
}
char getOperator()
{
std::cout << "Enter one of the following: +, -, *, or /: ";
char op;
std::cin >> op;
return op;
}
void printResult(double x, char op, double y)
{
if (op == '+')
std::cout << x << " + " << y << " is " << x + y << '\n';
else if (op == '-')
std::cout << x << " - " << y << " is " << x - y << '\n';
else if (op == '*')
std::cout << x << " * " << y << " is " << x * y << '\n';
else if (op == '/')
std::cout << x << " / " << y << " is " << x / y << '\n';
}
int main()
{
double x = getDouble();
char op = getOperator();
double y = getDouble();
printResult(x, op, y);
return 0;
}
在这种情况下,我们要求用户输入四个符号中的一个,但他们输入了“k”代替。“K”是一个有效的字符,因此std::cin愉快地提取它变量运算,这会返回到主。但我们的程序不希望这种情况发生,所以它不妥善处理这种情况下(因此从来没有输出任何东西)。
这里的解决办法很简单:做输入验证。这通常包括3个步骤:
1)检查用户输入是否是你所期望的。
2)如果是这样,返回值给用户。
3)如果没有,告诉用户出错了,让他们再试一次。
这是一个更新的getoperator()功能,并输入验证。