文章目录:
C++ getline
这个问题没有楼上说的那么简单,得从getline的源代码说起,应该算是getline函数的小Bug.
P.J. Plauger的getline实现中有这么一段
for (; ; _C = _I.rdbuf()-snextc())
if (_Tr::eq_int_type(_Tr::eof(), _C))
{
_St |= ios_base::eofbit;
break;
}
else if (_Tr::eq((_E)_C, _D))//这里_D表示行结束符,默认为'\n'
{
_Chg = true;
_I.rdbuf()-snextc();//问题出在这里,当_C已经读取到'\n'时,输入流指针已经到了末尾,不应该再读取下一个字符,因此_I.rdbuf()-snextc()将调用api函数,在标准输入的情况下,用户必须输入任意字符(或者没有)+回车才能让_I.rdbuf()-snextc()执行结束.是getline没有正确处理好标准输入流导致的
break;
}
else if (_X.max_size() = _X.size())
{
_St |= ios_base::failbit;
break;
}
else
_X += _Tr::to_char_type(_C), _Chg = true;
_CATCH_IO_(_I);
}
//楼主个可以把程序改成
main(){
string s1;
getline(cin,s1);
couts1'\n';
getline(cin,s1);
couts1'\n';
getline(cin,s1);
couts1'\n';
return 0;
}
就可以发现楼上的答案都不对
元音字母getline(cin,str)
#includestring//getline包含在string头文件里
#includeiostream
using namespace std;
int main()
{
string str;
getline(cin,str,'#');
char c=getchar();
coutstr' 'cendl;
return 0;
}
输入为:aa#b
输出为:aa b
再举例:
操作1:
这里输入流实际上只读入了Nice to meet you!,#后面的Hello!并没有存放到line中(仍停留在输入缓冲区里)。
而且这里把终止符设为#,你输入的时候就算输入几个回车换行也没关系,输入流照样会读入,譬如:
操作2:
这里,输入中的换行照样被读入到输入流中并且输出了。
(“再举例”部分的源代码在visual studio 中编译通过,操作1、2也是在该环境下进行的。)
注意
这个getline是个全局函数,而不是iostream的成员函数getline。
getline操作返回的是is(输入流),在使用while(getline(cin,line))的时候若想退出循环应使用EOF或ctrl+Z。
成员函数
getline也可以作为成员函数使用
cin.getline(char* cha,int num,char f);
向cha中输入num个字符,输入过程中达到num个数或者提前遇到f字符,输入结束。
c++中getline(cin,str) 这个函数是谁的方法??
getline是#include string中的一个模板函数,它的原型挺复杂的,具体可以看MSDN或string源代码,但他是一个全局函数,并不属于哪个类。
出在这里,当_C已经读取到'\n'时,输入流指针已经到了末尾,不应该再读取下一个字符,因此_I.rdbuf()-snextc()将调用api函数,在标准输入的情况下,用户必须输入
cin,str) 这个函数是谁的方法??getline是#include string中的一个模板函数,它的原型挺复杂的,具体可以看MSDN或string源代码,但他是一个全局函数,并不属于哪个类。