在C ++中getline的奇怪行为?

时间:2016-05-06 06:25:06

标签: c++ string getline

我知道使用cin我们无法读取多个字符串。但是这个程序中getline的行为很难理解。我无法弄清楚它的问题。是不是我不能同时使用cin和getline?

#include <iostream>
#include <string>

int main()
{
  std::string name;
  std::cout << "What is your name? ";
  std::cin>>name;
  std::cout << "Hello, " << name << "!"<<std::endl;
  getline (std::cin, name);
  std::cout << "Hello, " << name << "!\n";
}

Input :
Jai Simha Verma 
Jai Simha Verma

OUTPUT:
What is your name? Hello, Jai!
Hello,  Simha Verma !

1 个答案:

答案 0 :(得分:2)

代码std::cin>>name;相当于operator>>(std::cin, name);调用函数(在<string>中声明):

template <class CharT, class Traits, class Allocator> 
std::basic_istream<CharT, Traits>& operator>>(
        std::basic_istream<CharT, Traits>& is,
        std::basic_string<CharT, Traits, Allocator>& str);

使用模板参数CharT = charTraits = std::char_traits<CharT>>

根据以下文件: operator<<,>>(std::basic_string) 这将首先修剪空白,然后读取直到找到第一个空白字符(尽管这不是从流中提取的)。 因此它只读'Jai',即使'Jai Simha Verma \ n'是流的(未读)内容。

在你的电话getline (std::cin, name);,流将包含'Simha Verma \ nJai Simha Verma \ n',但是getline();停止阅读第一个换行符(它将提取它,但不会将其附加到name),因此它将name设置为'Simha Verma'(包括主要空间)。

此后,std::cin的(未读)内容将为'Jai Simha Verma \ n'。

我不确定你会想要什么样的行为,所以我无法建议如何实现这一点,而是我只是解释了发生了什么。