cin.get() 和 cin.getline() 之间的区别

Posted

技术标签:

【中文标题】cin.get() 和 cin.getline() 之间的区别【英文标题】:difference between cin.get() and cin.getline() 【发布时间】:2015-01-08 12:05:53 【问题描述】:

我是编程新手,对 C++ 中的 get()getline() 函数有一些疑问。

我对这两个功能的理解:

getline() 函数读取一整行,并使用 Enter 键传输的换行符来标记输入的结束。 get() 函数很像 getline(),但get() 不是读取并丢弃换行符,而是将该字符留在输入队列中。

我正在阅读的书(C++ Primer Plus)建议使用get() 而不是getline()。我的困惑是getline() 并不比get() 更安全,因为它确保以'\n' 结尾。另一方面,get() 只会将字符挂在输入队列中,从而可能导致问题?

【问题讨论】:

【参考方案1】:

有相同数量的优点和缺点,并且 - 基本上 - 都取决于您正在阅读的内容:get() 将分隔符留在队列中,因此您可以将其视为下一个输入的一部分。 getline() 将其丢弃,因此下一个输入将紧随其后。

如果您在谈论来自控制台输入的换行符,丢弃它是非常有意义的,但如果我们考虑来自文件的输入,您可以将下一个字段的开头用作“分隔符”。

什么是“好”或“安全”,取决于你在做什么。

【讨论】:

感谢您的回答,关于这件事我还有一个问题。如果输入的字符超过这两个函数的字符限制,可能会导致什么类型的错误? @YuZhou 用户可以输入的最大字符数为std::numeric_limits<std::streamsize>::max()。如果流的缓冲区内存不足,则会设置错误标志std::ios_base::badbit【参考方案2】:

cin.getline() 读取输入直到 '\n' 并停止

cin.get() 将输入读取到 '\n' 并将 '\n' 保留在流中

例如:

char str1[100];
char str2[100];
cin.getline(str1 , 100);
cin.get(str2 , 100);
cout << str1 << " "<<str2;

输入: 1 2 3 4 output 1 2 3 4 // 输出扩展

当反转它们时 例如:

char str1[100];
char str2[100];
cin.get(str2 , 100);
cin.getline(str1 , 100);
cout << str1 << " "<<str2;

输入: 1 2 3 4 output 1 2 // 因为 cin.getline() 读取了 '\n',所以输出未扩展

【讨论】:

非常好的解释。翻转代码行以查看不同的结果是一个令人难忘的例子!感谢您,今天学到了很多东西! @congar cin.getline() 不仅读取到 \n 并停止,而且还将其从输入流中丢弃 @congar ***.com/a/56406994/11862989 很好的解释【参考方案3】:

get() 从流中逐个字符地提取字符并返回其值(转换为整数),而getline() 用于逐行从文件中获取一行。通常 getline 用于过滤掉应用程序中的分隔符,其中您有一个平面文件(有数千行)并希望使用某些分隔符(逐行)提取输出,然后对其进行一些操作。

【讨论】:

【参考方案4】:

get() 和 getline() 函数的区别在于 getline() 函数提取分隔符但不将其放入字符串中。而 get() 函数不会从输入缓冲区中提取分隔符

【讨论】:

【参考方案5】:

cin.get() 接受包括行尾空间重复的整行输入,它将消耗下一个整行,但 getline() 用于逐行从文件中获取一行。

【讨论】:

以上是关于cin.get() 和 cin.getline() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

cin,cin.get(),cin.getline(),getline()

cin.get(), cin.getline() , getline(cin,s) 三者的区别

转 cincin.get()cin.getline()getline()gets()等函数的用法

c++中 cincin.get()cin.getline()cin.getchar()的区别

C++基础:各种输入方法总结,cincin.get()cin.getline()getline()gets()getchar()

cin.get ()的用法: