0

我这里有两个问题。

  1. 当我输入一个有效的输入(正数)时,它被成功放入向量中,但随后返回到下一个空白行,等待另一个输入,此时它应该再次询问相同的问题。它确实如此。只是所有其他输入为什么它会在这样的空白行上停止?

  2. 我怎样才能重新排列这个,所以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);
    
4

3 回答 3

1
  1. 你的问题没有显示的原因是因为你问了两次,只有一次显示了问题。你第一次问是在第一cout << "..."行之后。第二次是在while循环条件下:while (cin >> value). 第二次是不必要的,而且是一个不寻常的结构,我一直错过它,直到我在调试器中运行它:)

  2. 通过重新排列代码,您可以避免重复问题的输出。有关此类代码结构的示例,请参阅我的其他答案。寻找do() ... while (not ok)

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

于 2013-09-08T06:15:45.477 回答
0

好吧,您可以逐字读取输入并分别解析这些单词。如果无法从单词中检索到数字,将要求用户再次输入输入。如果没有更多单词,循环将停止:

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: ";
}

只是避免cin.fail()用于检查是否使用 last 检索输入是否>>成功并且不要忘记#include <sstream>:)

于 2013-09-08T06:11:40.800 回答
0
  1. cin>>value在循环中做了两次,但value只使用一次。
  2. 您需要分别检查cin.eof()(可能cin.bad()也是)和cin.fail()。请注意,这cin.eof()可能意味着cin.fail()您需要先检查 foreof或 forfail && ! eof或其他内容。
于 2013-09-08T06:28:43.993 回答