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()