注册 登录
编程论坛 C++教室

getline()问题

lishenming 发布于 2012-10-17 18:35, 326 次点击
程序代码:
#include <iostream>
#include <string.h>
using namespace std;

int main()
{
    int j,time;
    cin>>time;
    for (j=0; j<time; j++)
    {
        string str;
        getline(cin, str);
        cout<<str<<endl;
    }
    return 0;
}
为什么当循环次数为3时,只能输入两次???
还有输入下面会留一大段空白。
如:
3

asa
asa
sas
sas
Press any key to continue.
这个空白是怎么回事??
7 回复
#2
rjsp2012-10-17 22:04
看起来是 输入3后的那个回车被getline读进去了
试试 cin >> time >> std::ws;

#3
lishenming2012-10-18 10:28
回复 2楼 rjsp
srd::ws是什么意思啊??
#4
lishenming2012-10-18 10:29
回复 2楼 rjsp
嗯,这样可以啦。谢谢啦,就是不知道std::ws是什么意思
#5
wuyushuai5212012-10-18 17:08
麻烦版主解释一下:std::ws的意思?谢谢。。。
#6
pangdudu2012-10-18 17:31
其实这里面还有一个问题,如果不是使用cin>>time>>std::ws;的话,如果time输入为1的话,for循环就不会执行,这里还是不太明白,可能还是涉及到ws的用法,请帮忙解释下......
#7
qq8725519692012-10-18 19:03
这个问题问得不错,我不是很熟悉这方面的东西,容我研究研究。
#8
rjsp2012-10-19 09:51
以下是引用lishenming在2012-10-18 10:28:10的发言:

std::ws是什么意思啊??

ws 是 whitespace(空白字符,包括空格、制表符、回车等) 的缩写,函数原型是 istream& ws( istream& );
std::cin >> std::ws; 的作用就是将 std::cin 中接着一段空白字符取出丢掉。
为什么要丢掉?比如你输入 3 然后回车
3 被 cin>>time; 取到time中去了,但回车还在
然后 getline(cin, str); 就把这个回车读进去了,也就是str是个空字符串
我仔细想了一下,用 cin >> time >> ws; 是不对的,因为它会将下一行开头的空白字符也去掉了。这样改吧
程序代码:
#include <iostream>
#include <string>
using namespace std;

int main()
{
    int time;
    cin >> time;
    cin.ignore(); // 将随后的一个字符(即'\n')忽略掉
    for( int j=0; j<time; ++j )
    {
        string str;
        getline( cin, str );
        cout << str << endl;
    }

    return 0;
}

1