我正在使用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,所以很早就陷入困境是非常令人沮丧的。
谢谢和问候。
答案 0 :(得分:5)
您需要通过文件结束字符终止输入(即Windows上的 CTRL-Z ,Mac / Unix上的 CTRL-D ),而不是只是一个行尾(即 Enter )。
一个简单的 Enter 被解释为空格,operator>>
在读入整数数据类型时会被忽略。
CTRL-Z / End-Of-File会使任何operator>>
失败并显示错误。
注意:输入f
也会终止您的循环,因为f
不被视为有效的整数;因此,std::cin >> value
value
类型int
和f
之类的输入也会失败。更准确:operator>>
实际上返回对输入流的引用,但如果读取值失败,则在流上设置failbit
,然后在布尔表达式中解释流对象(隐式地调用basic_istream::operator bool()
)会返回false
;因此,本书的作者可能不想在书中的相应部分解释这些细节: - )
答案 1 :(得分:2)
这是预期的吗?
是,这就是while (std::cin >> value)
的作用。有关更多说明,请参阅此答案:How is "std::cin>>value" evaluated in a while loop?
是否有任何代码在输入换行符后停止?
否,因为>>
只是忽略了一个空格(也是@StephanLechner提到的)
你能做的是:
只是给出一个条件;如果它只满足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 :(得分: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;
}