C++ 我如何重新安排这一点,以便在c+;中测试有效输入的同时,输入Ctrl-z(文件结束信号)中断循环+;

C++ 我如何重新安排这一点,以便在c+;中测试有效输入的同时,输入Ctrl-z(文件结束信号)中断循环+;,c++,string,validation,parsing,io,C++,String,Validation,Parsing,Io,我这里有两个问题 当我输入一个有效的输入(正数)时,它将成功地放入 向量,但当 它应该再问一次同样的问题。确实如此。只需每隔一次输入 为什么它会停在这样一个空行上 我如何重新安排它,以便Ctrl+Z将发出文件结束的信号,而不是失败 无效输入 do { cout << "\nPlease enter a homework score<'Ctrl-z' when done>: "; cin >> value; while(cin.fail() ||

我这里有两个问题

  • 当我输入一个有效的输入(正数)时,它将成功地放入 向量,但当 它应该再问一次同样的问题。确实如此。只需每隔一次输入 为什么它会停在这样一个空行上

  • 我如何重新安排它,以便Ctrl+Z将发出文件结束的信号,而不是失败 无效输入

    do
    {   
     cout << "\nPlease enter a homework score<'Ctrl-z' when done>: ";
     cin >> value;
    
     while(cin.fail() || value < ZERO)
     {
         cout << "not a valid positive numerical value. try again. \n";
         cin.clear();
         cin.ignore(numeric_limits<int>::max(),'\n');
         cout << "\nplease enter a valid homework score<'Ctrl-z' when done>: ";
         cin >> value;
     }  
         assignmentScore.push_back(value);
    
    }while(cin >> value);
    
    do
    {   
    cout>值;
    while(cin.fail()| |值<零)
    {
    cout>值;
    }  
    赋值分数。推回(值);
    }而(cin>>值);
    

  • 嗯,你可以逐字阅读输入的单词,然后分别解析这些单词。如果无法从word中检索到数字,将要求用户再次输入。 如果没有更多单词,循环将停止:

    std::string word;
    std::cout << "Enter score: ";
    while (std::cin >> word) {
        unsigned int value;
        std::istringstream is(word);
        if (is >> value) {
            assignmentScore.push_back(value);
        }
        else {
            std::cout << std::endl
                   << word << " is not a valid positive numerical value. try again.";
            std::cin.clear();
            std::cin.ignore(numeric_limits<int>::max(), '\n');
        }
        std::cout << std::endl << "Enter score: ";
    }
    
    std::字符串字;
    std::cout>word){
    无符号整数值;
    std::istringstream是(word);
    如果(是>>值){
    赋值分数。推回(值);
    }
    否则{
    标准::cout
    
  • 你的问题没有显示的原因是因为你要求它两次,只有一次显示问题。你第一次提问就在第一次
    cout>value)
    之后。第二次提问是不必要的,而且是如此不寻常的构造,以至于我一直错过它,直到我在调试器中运行它:)

  • 通过重新排列代码,您可以避免重复问题的输出。有关此类代码结构的示例,请参阅。查找
    do()…而(不确定)

  • 通常,在标准输入流中,您永远无法到达文件的结尾。到达它的唯一时间是当另一端(终端)关闭“管道”时。这意味着,一旦到达文件末尾,您将无法读取任何其他内容-此时您的程序处于静音状态,无法再获得任何输入。这可能不是您想要的。建议使用sentinel值(例如“键入-1以完成”)更有意义

  • 您在循环中执行了两次
    cin>>value
    ,但只使用了一次
    value
  • 你需要分别检查
    cin.eof()
    (也可能是
    cin.bad()
    )和
    cin.fail()
    。注意
    cin.eof()
    可能意味着
    cin.fail()
    ,所以你需要先检查
    eof
    ,或者检查
    fail&&!eof
    ,或者其他什么

  • 我认为使用sentinel值会简单得多,如果你尝试使用调试器单步执行代码,那可能比任何解释都更有启发性…我认为从
    cin
    读取会导致
    cout
    被刷新。否则他也不会第一次看到问题。不是100%确定,请在之前验证或者可能编辑答案…另外,在标准输入上等待EOF是完全正常的,使用sentinel值是多余的。如果用户将EOF发送到结束输入,则用户不认为这是错误的(Unix风格的shell上的ctrl-d,CP/M上的crtl-z,MS-DOS,Windows风格的shell。是的,但是假设会有更多的交互,对吗?一旦你点击ctrl-z,你就完成了,不是吗?是的,EOF是输入的结束。如果有菜单结构或其他东西,那么一些输入需要表示“返回菜单”,等等。我仍然会避免使用哨兵值,并且istead使用非数字命令。