【问题标题】:Wierd behaviour of getline in C++ ? [duplicate]C++ 中 getline 的奇怪行为? [复制]
【发布时间】:2016-05-06 06:25:05
【问题描述】:

我知道使用 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 !

【问题讨论】:

  • 有什么奇怪的?你到底想要什么?
  • @Issac 很好地描述了这种行为。这是预期的行为,但如果您希望代码通过“getline”调用读取下一行,那么您可以使用“cin.ignore(streamsize, delim)”跳过当前行。 cplusplus.com/reference/istream/istream/ignore

标签: c++ string getline


【解决方案1】:

代码std::cin&gt;&gt;name;相当于operator&gt;&gt;(std::cin, name);这个调用函数(在&lt;string&gt;中声明):

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&lt;CharT&gt;&gt;

根据以下文档: 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”。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    相关资源
    最近更新 更多