2 u013828744 u013828744 于 2014.12.14 10:04 提问

求问关于c++里的while (cin >> string)

string line;
while (cin >> line)
cout << line << endl;
为什么输入"Hello world"会输出
Hello
world
明白不会有空格,但是为什么会出来两个string?而且是聚集出来的?输出之前这两个string都存到哪里了?

5个回答

u011767611
u011767611   2014.12.14 20:41
已采纳

你这个问题涉及缓冲区,但是具体怎样分析,我给你如下代码事例:

#include <iostream>
#include <unistd.h>
#include <string>
#include <cstdio>
using namespace std;
int main(void)
{
    string line;
    while(cin>>line){
    cout<<line<<endl;
    printf("[--printf--]");//buffer io
    fprintf(stderr,"[--stderr--]");//no buffer
    }   
    puts("\n");
    return 0;
}


(注意输入,仍然有空格)
输入:123 456
123
[--stderr--][--printf--]456
[--stderr--][--printf--]
我们都知道stderr流是不带缓存区的,你可以看到123比它输出在前,说明空格符居然刷新缓存区的作用。
而printf是带缓存区的,printf缓存区的内容与456在遇到endl后刷新缓存区,所以输出。
接下来的[--stderr--][--printf--]只是程序顺序执行的必然结果。

u013944212
u013944212 回复u011767611: vc++6.0
3 年多之前 回复
u011767611
u011767611 回复u013944212: 我使用的是linux g++编译器,不知道在你的平台使用的什么编译器?
3 年多之前 回复
u013944212
u013944212 回复u011767611: 没有,就是直接复制你上面的那个程序,执行结果是[--printf--][--stderr--]456
3 年多之前 回复
u011767611
u011767611 回复u013944212: 你的printf语句里是否包括(\n)了呢?
3 年多之前 回复
u013944212
u013944212 为什么我执行的结果里。。。printf 和 stderr 对调了呢
3 年多之前 回复
u013944212
u013944212 为什么我执行的是:
3 年多之前 回复
u013944212
u013944212 为什么我执行的是:
3 年多之前 回复
u013828744
u013828744 谢谢您清楚地解答!我明白了!太感谢了!~~
3 年多之前 回复
lxq_xsyu
lxq_xsyu   Rxr 2014.12.14 12:15

存入了输入缓冲区,std::cin和std::cout是带缓冲的,所以会出现这个现象。

u013828744
u013828744 感谢!!
3 年多之前 回复
testcs_dn
testcs_dn   Rxr 2014.12.14 10:13

是因为里面有回车或换行符吧。

u013828744
u013828744 我明白您的意思了,确实是加了换行符。只是比较好奇为什么用同一个变量储存的两个值可以一齐输出来~
3 年多之前 回复
u013828744
u013828744 标准cin不是不记录换行符吗?
3 年多之前 回复
u012763794
u012763794   2014.12.14 10:28

空格也是cin的分隔符啊

u013828744
u013828744 所以我输入hello world, 程序将它切割成两个string。可是按照while的逻辑不是应该hello的时候出现\0分隔一下cin,输出hello;输入world的时候再输出world?不知道我说明白了没有。。
3 年多之前 回复
huaxiarenxiahua
huaxiarenxiahua   2014.12.16 09:35

这种情况,是我用geiline 的,你可以试试

u013828744
u013828744 知道有getline,只是思考出现这种现象的原因而已
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!