Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++中输入错误后使用输入流_C++_Input - Fatal编程技术网

在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谢谢,是的,你是对的,但我想知道为什么它不是这样工作的?