用c ++读取未知数量的输入

时间:2018-05-30 15:13:32

标签: c++ while-loop io c++14

我正在使用C ++ Primer一书学习C ++。

在1.4.3节中,给出了以下关于读取未知数量输入的示例代码。

#include <iostream>
int main()
{
  int sum = 0, value = 0;
  // read until end-of-file, calculating a running total of all values read
  while (std::cin >> value)
  sum += value; // equivalent to sum = sum + value
  std::cout << "Sum is: " << sum << std::endl;
  return 0;
}

根据本书,如果我们输入3 4 5 6,则输出为Sum is: 18

但是当我在我的电脑上尝试这个(带有mingW的Windows 10)时,代码并没有结束。即使我输入换行符,它也会继续询问输入。它只在我输入像f这样的非int输入时才有效。

这是预期的吗?如果是,是否有任何代码在输入换行符后停止?

我对c ++很陌生,而且我已经学过python,所以很早就陷入困境是非常令人沮丧的。

谢谢和问候。

3 个答案:

答案 0 :(得分:5)

您需要通过文件结束字符终止输入(即Windows上的 CTRL-Z ,Mac / Unix上的 CTRL-D ),而不是只是一个行尾(即 Enter )。

一个简单的 Enter 被解释为空格,operator>>在读入整数数据类型时会被忽略。

相反,

CTRL-Z / End-Of-File会使任何operator>>失败并显示错误。

另见this SO answer

注意:输入f也会终止您的循环,因为f不被视为有效的整数;因此,std::cin >> value value类型intf之类的输入也会失败。更准确:operator>>实际上返回对输入流的引用,但如果读取值失败,则在流上设置failbit,然后在布尔表达式中解释流对象(隐式地调用basic_istream::operator bool())会返回false;因此,本书的作者可能不想在书中的相应部分解释这些细节: - )

答案 1 :(得分:2)

  

这是预期的吗?

,这就是while (std::cin >> value)的作用。有关更多说明,请参阅此答案:How is "std::cin>>value" evaluated in a while loop?

  

是否有任何代码在输入换行符后停止?

,因为>>只是忽略了一个空格(也是@StephanLechner提到的)

你能做的是:

  1. 只是给出一个条件;如果它只满足break循环。您 也可以提供一个控制台,使其更容易理解 用户。例如:

    std::cout << "Enter value to sum or press -1 to exit" << std::endl;
    
    while (std::cin >> value && value != -1) // if value == -1, loop stops.
    {
        sum += value;
    }
    
  2. 您可以在字符结尾处终止:

      Windows上的
    • CTRL-Z
    • Mac / Unix上的
    • CTRL-D

答案 2 :(得分:1)

  

这是预期的吗?

是的,因为operator>>默认忽略前导空格,其中包括换行符。

  

如果是,是否有任何代码在输入换行符后停止?

使用std::cin.getline()std::getline()代替operator>>。然后,您可以使用operator>>std::istringstream来解析每行的值,例如:

#include <iostream>
#include <string>
#include <sstream>

int main()
{
    std::string line;
    int sum, value;

    do
    {
        std::cout << "Enter a set of numbers, or a blank line to exit: ";
        if (!std::getline(std::cin, line) || line.empty())
            break;

        // read until end-of-line, calculating a running total of all values read
        std::istringstream iss(line);
        sum = 0;
        while (iss >> value)
            sum += value; // equivalent to sum = sum + value

        std::cout << "Sum is: " << sum << std::endl;
    }
    while (true);

    return 0;
}

Live Demo