getline和std::istream::operator>>()有什么区别?

6
#include <iostream>
#include <string>

using namespace std;

int main()
{
   string username;
   cout<< "username" ;
   cin >> username; 
}

我很好奇这两个代码有什么区别,我听说它们是一样的,但如果是这样,为什么要有两种方式呢?

#include <iostream>
#include <string>
using namespace std;

int main()
{  
   string username;
   cout << "username" ;
   getline (cin,username) ;
}

“getline和cin有什么区别?”它们的差异就像“苹果和大象”一样不同。 - πάντα ῥεῖ
5个回答

12

不同之处在于std::getline — 正如其名字所示 — 从给定的输入流(可能是std::cin)中读取一行,而operator>>则读取一个单词1

也就是说,std::getline会一直读取直到找到换行符,而operator>>会一直读取直到找到空格(由std::isspace定义)。两者都会将各自的分隔符从流中移除,但不会将其放入输出缓冲区。

1. 注意,>>也可以读取数字 — int, short, float, char等。


如果应用于std::string变量,那么and operator>>会读取一个单词。 - πάντα ῥεῖ
更准确地说,`operator >>' 会读取直到找到一个空格或换行符。 - Svalbard
@Svalbard:这个并不精确operator >>会一直读取,直到找到由std::isspace定义的空格为止。这才是精确的。而且,std::isspace依赖于当前地区设置,可以将任何字符定为空格。你甚至可以将所有小写字母都定义为空格,这样operator>>就会跳过所有小写字母。 - Nawaz

6
std::istream>>运算符读取以空格分隔的字符串。

getline函数读取到给定分隔符(默认为'\n')为止。

因此,getline可以读取包含空格的字符串,而>>运算符则不行。


3
实际上有两个getline函数:一个在许多stream类中,另一个是自由函数。流getline函数将char*数组作为参数,读取字符和最大字符数。自由函数将std::string作为参数,因此在需要时调整字符串大小。这两个函数都可以选择性地使用第三个参数,即分隔符(默认为'\n')。
输入运算符operator>>用于读取格式化输入。例如,如果运行int i; std::cin >> i;,它将尝试将输入转换为整数,而getline函数将读取其字符。输入运算符还默认删除所有空格。它也用于将类定制序列化为字符串,如here所示。

3

简单回答: getline:顾名思义,获取遇到“\n”换行符之前的所有内容。在这里,输入始终被视为字符串。 因此,如果您编写:

string someStr;
getline(cin, someStr);  //here if you enter 55, it will be considered as someStr="55";

">>"(按位右移运算符):既聪明又愚蠢。 它可以接收您定义的任何基本数据类型的输入,但会在遇到第一个非数据类型字符时停止。 例如:

int someInt;
std::cin >> someInt;  //here if you enter "55some", >> will only consider someInt=55;

因此,如果你写:

string someStr;
cin >> someStr;   

在这里,如果你输入"I am Batman",cin会理解"I"是一个字符串,但是空格不是,所以它会停在"I",你将得到someStr="I"。

重要提示: 如果你连续使用>>和getline,你会遇到问题。 对于>>,即使"\n"(换行符)也不是数据类型。 因此,如果你写成:

int someStr, someStr2;
std::cin >> someStr;   //here you enter "Batman"
getline(cin, someStr2);  //here you enter "Bruce"

由于 >> 不识别 "\n" 字符,它只能看到 "Batman" 并退出缓冲区,留下 "\n" 给 someStr2。 因此,someStr2 将得不到 "Bruce",而是得到 ""(换行符)。


0
有时在使用 cin 后紧接着需要读取一行,如果你在 cin>> 后使用 getline(),那么可能会遇到一个问题,即在 getline() 变量中什么也没有。为了避免这种情况,可以采取以下措施:
cin>>consoleInputVariable;
cin.ignore();
getline(cin,getLineVariable);

简而言之,ignore() 的使用非常方便,请注意。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接