在C++中输入错误后使用输入流
这是我对教科书中一个简单问题的解答。在这里面,我尝试使用输入流,以便首先检测非数字输入,然后检查它是否以“|”字符开头以终止程序:在C++中输入错误后使用输入流,c++,input,C++,Input,这是我对教科书中一个简单问题的解答。在这里面,我尝试使用输入流,以便首先检测非数字输入,然后检查它是否以“|”字符开头以终止程序: int main() { double n1, n2; char Finisher; while (true) { std::cout << "Enter number 1:\n"; if (std::cin >> n1) {} else {
int main()
{
double n1, n2;
char Finisher;
while (true) {
std::cout << "Enter number 1:\n";
if (std::cin >> n1) {}
else {
std::cin >> Finisher;
if (Finisher == '|') break; //Condition that must lead to program termination.
std::cin.clear();
std::cin.ignore(40000,'\n'); //40000: only a big number
}
std::cout << "Enter number 2:\n";
if (std::cin >> n2) {}
else {
std::cin >> Finisher;
if (Finisher == '|') break;
std::cin.clear();
std::cin.ignore(40000, '\n');
}
if (n1 < n2) {
std::cout << "The smaller value is: " << n1 << " \nThe larger value is: " << n2 << '\n';
if ((n1 - n2) < 1.0 / 100 && (n1 - n2) > -1.0 / 100) {
std::cout << "The values are almost equal\n";
}
}
else if(n1>n2){
std::cout << "The smaller value is: " << n2 << " \nThe larger value is: " << n1 << '\n';
if ((n1 - n2) < 1.0 / 100 && (n1 - n2) > -1.0 / 100) {
std::cout << "The values are almost equal\n";
}
}
else { std::cout << "both values are equal\n"; }
}
return 0;
}
问题是我的Finisher char变量似乎没用,任何非数字输入类型都会丢失!无论我输入了什么,都会在其中输入另一个固定字符,在我的情况下,总是这样:
怎么了?!
谢谢。移动清理似乎有效:
if (std::cin >> n1) {}
else {
std::cin.clear();
std::cin >> Finisher;
if (Finisher == '|') break; //Condition that must lead to program termination.
std::cin.ignore(40000,'\n'); //40000: only a big number
}
问题是,一旦读取失败,cin将处于一种状态,在您清除它之前,它将无法读取任何其他内容。你需要呼叫cin.clear;在完成器中读取之前 当然,这仍然会让你处于一个位置,你在为终结者阅读一个单独的字符。读入一个令牌,然后检查它是数字还是管道字符会更优雅
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <stdexcept>
#include <string>
typedef double number;
number parse_number() {
static std::string in;
static std::istringstream stream;
number ret;
std::cin >> in;
stream.clear();
stream.str(in);
if (stream >> ret)
return ret;
if (in.front() == '|')
std::exit(0);
std::ostringstream error;
error << "Could not parse token, \"" << in << ".\"";
throw std::runtime_error(error);
}
int main() {
while (true) {
const number n1 = parse_number();
const number n2 = parse_number();
// Do stuff with the numbers.
}
}
只是吹毛求疵。你可能想做得更干净利落一些——不要重复你自己。为什么不读一个字符串呢?或者,检查第一个字符是否正确,然后尝试读一读。如果不是数字,则检查“|”,如果没有找到,则丢弃输入。@Yuriy lvaskevych清除它以改变std::cin的失败状态,这样它就可以再次接受新输入的输入,我使用“忽略”删除以前的输入。他们的名字Clear&ignore与他们的名字有些不同do@Someprogrammerdude谢谢,是的,你是对的,但我想知道为什么它不是这样工作的?