我正在使用《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
(其中value
为int
类型)和类似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提到)
你可以做的是:
-
只要给出一个条件;如果它仅满足循环的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; }
-
您可以简单地通过字符结尾终止:
- CTRL-Z在Windows上
- CTRL-D在Mac/Unix上