为何指定空格为分隔符时getline(cin, ...)无法读取无尾空格的输入?
问题分析与解决
为什么两个版本行为不同?
- 第一个代码的核心问题:当用
getline(cin, input, ' ')指定空格为分隔符时,终端的标准输入流cin不会因为你按下回车就结束。输入"abc"回车后,缓冲区里是abc\n,没有空格,getline会一直阻塞等待你输入空格或手动触发EOF(Unix按Ctrl+D,Windows按Ctrl+Z),程序根本没走到cout那一步,所以没输出。 - 第二个代码能正常运行的原因:
getline(cin, input)会把回车前的abc读入(自动丢弃换行符),存入stringstream后,这个流的内容是明确的abc,有固定的末尾。getline(ss, input, ' ')读取到流末尾时,即使没找到空格,也会停止并返回已读到的内容,所以能输出abc。
简化的解决方案
如果你的需求就是读取第一个空格前的内容(不管输入有没有空格),完全不用绕弯子,直接用cin的默认输入操作即可:
string input; cin >> input; cout << input;
cin >> input默认以所有空白字符(空格、换行、制表符等)作为分隔符,输入abc或abc def都会输出abc,完全满足你的需求。
内容的提问来源于stack exchange,提问作者ClumsyHat
相关产品推荐
相关产品推荐

