我知道使用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 !
答案 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 = char
和Traits = 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'。
我不确定你会想要什么样的行为,所以我无法建议如何实现这一点,而是我只是解释了发生了什么。