为何输入空格分隔字符串时,循环外仅输出第一个,循环内可逐个输出?
为什么两种cin读取字符串的代码输出结果不同?
先把问题里的两段代码摆出来,方便咱们对比分析:
能逐个打印所有输入字符串的代码
string current; while (cin >> current) { cout << current << " \n"; }
只打印第一个输入字符串的代码
string current; cin >> current; cout << current << " \n";
其实差异的根源,全在cin >> current这个操作的两个特性上:
- 第一,
cin >> current的功能是从输入流里读取一个以空白字符(空格、换行、制表符都算)分隔的字符串,读到的内容存在current里。 - 第二,这个操作会返回
cin对象本身;而当cin被用作布尔判断条件时(比如while循环里),C++会自动检查它的状态:如果输入流还能正常读取内容(没遇到EOF、没输入错误),就转换成true,循环继续;要是读不到内容了(比如你按了Ctrl+D/Ctrl+Z触发EOF,或者输入了非字符串的内容),就转换成false,循环终止。
那咱们分别看两段代码的逻辑:
- 第一段代码里,
while (cin >> current)相当于循环执行“读字符串→打印→再读下一个”:第一次读第一个字符串打印,接着尝试读第二个,只要能读到就继续打印,直到读不动为止,自然能把所有输入的字符串都打印出来。 - 第二段代码就简单多了:它只执行了一次
cin >> current,也就是只读了第一个字符串,打印完就直接结束程序了,完全没去碰后面的输入内容。
举个实际例子,如果你输入apple banana cherry:
- 第一段代码会依次读取
apple、banana、cherry,逐个打印; - 第二段代码只会读取
apple,打印一次就结束,剩下的banana cherry根本没被处理。
另外补充个小细节:cin >>读取字符串时,会自动跳过开头的空白字符,所以不管你输入时用空格还是换行分隔,它都能准确读取每个独立的字符串。
内容的提问来源于stack exchange,提问作者Victor
相关产品推荐
相关产品推荐

