std::cin.getline()和std::cin有什么区别?

43
什么情况下应该使用 std::cin.getline()?它与 std::cin 有什么区别?
5个回答

45

让我们来解析一下std::cin.getline()。首先,有std::。这是标准库所在的命名空间。它拥有数百种类型、函数和对象。

std::cin是这样一个对象。它是标准字符输入对象,定义在<iostream>中。它有一些自己的方法,但你也可以用许多自由函数与它配合使用。大多数这些方法和函数都是从标准输入中获取一个或多个字符的方式。

最后,.getline()std::cin(和其他类似的对象)的一种方法。你告诉它应该从左边的对象(这里是std::cin)获取多少个字符,并把它们放在哪里。精确的字符数可能会有所不同:.getline()会在三种情况下停止: 1. 到达行末 2. 输入中没有剩余字符(在std::cin上通常不会发生,因为你可以继续输入) 3. 读入了最大数量的字符。

还有其他可以与std::cin对象一起使用的方法和函数,例如:

  std::string s;
  int i;
  std::cin >> s; // Read a single word from std::cin
  std::cin >> i; // Read a single number from std::cin
  std::getline(std::cin, s); // Read an entire line (up to \n) from std::cin
  std::cin.ignore(100); // Ignore the next 100 characters of std::cin

24

对于char*的情况,在使用std::cin.getline获取一行时,与std::cin获取第一个单词不同。


15
我不理解这个答案。std::cin 不会获取任何东西;它只是一个对象。在它执行任何操作之前,你必须对它进行某些操作(例如调用像 get 这样的成员函数)。 - CB Bailey
1
char s1[256], s2[256]; std::cin >> s1; cin.getline(s2, 256); - alvelcom
5
std::cin >> s1 是调用全局函数 istream& operator>>(istream&, char*) - eq-
2
这个答案需要进行编辑。措辞和解释令人困惑。 - Arjuna Deva

10

你有阅读过任何文档(例如http://www.cplusplus.com/reference/string/getline/)吗?

基本上,std::cin(或更一般地说,任何std::istream)可直接使用以获取格式化的输入, 例如int x; std::cin >> x;。仅仅使用std::cin.getline() 来填充一个原始的char *缓冲区。


4
成员函数 getline 并不会返回一个 std::string,它是用于填充 char* 缓冲区的。获取 std::stringgetline 是自由函数 std::getline - etarion
@Oli。是的,我看了一下文档,但没有理解。现在,我觉得更清楚了。谢谢。 - Simplicity
链接已损坏。 - ivanleoncz

4

简单来说,std::cin.getline() 可以包含空格,而 std::cin >> 不能。


这似乎很适合作为一个简单的例子。谢谢。 - hochan

1

如其他回答中已经讲解,使用 getline() 函数读取一整行(即以 \n 结尾的字符串),使用 cin>>var 读取与 var 类型匹配的数字(整数、浮点数、双精度等)或单词。

在此回答中,我想强调当两种方法混用时会出现的问题。当你这样做时:

int a;
string s;
cin>>a;
getline(cin, s)

cin 会留下一个换行符 \n,这个字符会被 getline(); 读取。可以通过使用 cin.ignore() 来解决这个问题。

int a;
string s;
cin>>a;
cin.ignore();
getline(cin, s)

cin.ignore() 只会丢弃一个字符,而 cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' ); 会丢弃该行的其余部分,包括换行符。在这种情况下使用 cin.ignore() 似乎没有意义,因为 cin>>a 只会读取一个单词。因此,您不能假设下一个字符是换行符。 - Andreas Wenzel

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