如何读取未知数量的输入

How to read unknown number of inputs?

本文关键字:未知数 输入 读取 何读取      更新时间:2023-10-16

我正在使用《C++入门》一书学习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

但当我在我的电脑上尝试这个(Windows 10 with MinGW)时,代码并没有结束。即使我输入了换行符,它也会不断地要求输入。只有当我输入像f这样的非int输入时,它才起作用。


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

我对c++还很陌生,而且我已经学会了python,所以这么早就陷入困境是很令人沮丧的。


谢谢和问候。

您需要通过文件结束字符(即Windows上的CTRL-Z,Mac/Unix上的CTRL-Dnter)。

简单的Enter被解释为空白,operator>>在读取积分数据类型时会简单地忽略空白。

相反,CTRL-Z/文件结束会使任何operator>>失败并出现错误。

另请参阅此SO答案。

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

这是预期的吗?

是的,因为默认情况下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;
}

实时演示

这是预期的吗?

,这就是while (std::cin >> value)的作用。请参阅此答案以获得更多解释:How is"std::cin>gt;值";在while循环中评估?

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

,因为>>只是忽略空白(也有@StephanLechner提到)

你可以做的是:

  1. 只要给出一个条件;如果它仅满足循环的CCD_ 24。你还可以提供控制台,使使用者例如:

    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. 您可以简单地通过字符结尾终止:

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