C++ Primer示例代码在Windows下无法按换行终止输入的问题咨询
解答你的C++输入困惑
首先明确说:这完全是预期行为,别担心不是你环境的问题,也不是你写错代码了。
为什么原来的代码会这样?
《C++ Primer》里那段读取未知数量输入的代码,核心逻辑是用while (cin >> num)循环读取整数对吧?这里的cin >> num会自动跳过所有空白字符——包括空格、制表符,还有你输入的换行符。对C++输入流来说,换行符和空格没区别,只是用来分隔整数的“分隔符”而已。所以你输入3 4 5 6再按回车,程序只会把这四个整数读进去,但因为输入流还没“结束”,它会继续等你输入更多内容。
只有两种情况会让这个循环停下来:
- 输入了非整数类型的内容(比如你输入的
f),这时候cin >> num会失败,循环终止; - 手动触发输入流结束(EOF):在Windows里按
Ctrl+Z然后回车,在Linux/macOS里按Ctrl+D。
你之前学Python会觉得困惑很正常——Python的input()是按“行”读取的,回车就代表一行输入结束,但C++的标准输入默认是按“标记(token)”读取的,整数就是一个标记,空白符只是分隔标记的东西,不代表输入结束。
怎么让程序在输入换行后就终止?
如果你想要输入一行数字(比如3 4 5 6),按回车就直接求和终止,那可以换一种思路:先读取一整行输入,再从这行里解析出所有整数。具体代码如下:
#include <iostream> #include <string> #include <sstream> // 要包含这个头文件来使用istringstream using namespace std; int main() { int sum = 0; int num; string line; // 先读取一整行输入,直到遇到换行符 getline(cin, line); // 把读取到的字符串转换成一个输入流,这样就能像用cin一样读取整数了 istringstream iss(line); // 从这个字符串流里读取整数求和 while (iss >> num) { sum += num; } cout << "Sum is: " << sum << endl; return 0; }
代码解释:
getline(cin, line):一次性读取用户输入的一整行(包括空格,但不包括最后的换行符),存到line字符串里;istringstream iss(line):把字符串line包装成一个“内存输入流”,这样我们就能用和cin一样的方式(iss >> num)从里面读取整数;- 之后的循环和原来的逻辑一样,只是从字符串流里读,读完这行里的所有整数后,循环就会终止,不用再输入其他内容。
这样修改后,你输入3 4 5 6然后按回车,程序就会直接输出Sum is: 18并结束,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Agile_Eagle
相关产品推荐
相关产品推荐

