getline函数源码_c getline函数

hacker|
83

文章目录:

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源代码,但他是一个全局函数,并不属于哪个类。

2条大神的评论

  • avatar
    访客 2022-07-05 下午 06:11:57

    出在这里,当_C已经读取到'\n'时,输入流指针已经到了末尾,不应该再读取下一个字符,因此_I.rdbuf()-snextc()将调用api函数,在标准输入的情况下,用户必须输入

  • avatar
    访客 2022-07-05 下午 06:43:09

    cin,str) 这个函数是谁的方法??getline是#include string中的一个模板函数,它的原型挺复杂的,具体可以看MSDN或string源代码,但他是一个全局函数,并不属于哪个类。

发表评论