std::cin.getline() 与 std::cin

Posted

技术标签:

【中文标题】std::cin.getline() 与 std::cin【英文标题】:std::cin.getline( ) vs. std::cin 【发布时间】:2011-06-12 08:44:44 【问题描述】:

什么时候应该使用std::cin.getline()?和std::cin有什么区别?

【问题讨论】:

【参考方案1】:

您是否阅读过任何文档(例如 http://www.cplusplus.com/reference/string/getline/)?

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

【讨论】:

成员 getline 不会为您提供std::string,它用于填充char* 缓冲区。获取std::string 的getline 是免费函数std::getline @Oli。是的,我看了一些文档,但没有明白。现在,我认为它更清楚了。谢谢。【参考方案2】:

如果是 char*,std::cin.getline 获取行,而不是 std::cin 获取第一个单词。

【讨论】:

我不明白这个答案。 std::cin 什么也得不到;它只是一个对象。在它做任何事情之前,你必须对它做一些事情(例如,调用像 get 这样的成员函数)。 char s1[256], s2[256]; std::cin >> s1; cin.getline(s2, 256); std::cin >> s1 是对全局函数istream& operator>> (istream&, char*)的调用 这个答案需要编辑。措辞和解释令人困惑【参考方案3】:

让我们把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

【讨论】:

【参考方案4】:

正如其他人已经回答(甚至更好)粗略地说,使用getline() 读取整行(即,以\n 结尾的字符串)和cin>>var 读取与@987654324 类型兼容的数字@(整数、浮点数、双精度等)或单个单词。

在这个答案中,我想强调混合这两种方法时出现的一个问题。当你这样做时:

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 只会读取一个单词。因此,您不能假设下一个字符将是换行符。【参考方案5】:

(非常简单)我的回答是,std :: cin.getline() 可以包含空格,而std :: cin >> 不能。

【讨论】:

这似乎是一个简单的例子。谢谢。

以上是关于std::cin.getline() 与 std::cin的主要内容,如果未能解决你的问题,请参考以下文章

如何检查输入的长度? (C++)

std::vector 与 std::list 与 std::slist 的相对性能?

std::bind 与 std::function 与 Clang 崩溃

std::dynarray 与 std::vector

为啥 pandas.Series.std() 与 numpy.std() 不同?

std::vector::resize() 与 std::vector::reserve()