2016-05-06 8 views
-2

Ну, я знаю, используя cin, мы не можем читать несколько строк. Но поведение getline здесь в этой программе трудно понять. Я не могу понять, в чем проблема. Я не могу использовать cin и getline в тандеме?Wierd поведение getline в C++?

#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

Что странно? Что именно вы хотите? –

+0

@ Иссак описал поведение очень хорошо. это ожидаемое поведение, но если вы ожидали, что ваш код будет читать следующую строку с помощью вызова «getline», вы можете пропустить текущую строку, используя «cin.ignore (streamsize, delim)». http://www.cplusplus.com/reference/istream/istream/ignore/ – Rana

ответ

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) Это сначала обрезает пробелы, затем читается до первого символа пробела er (хотя это не извлекается из потока). Таким образом, он только читает «Jai», хотя «Jai Simha Verma \ n» является (непрочитанным) содержимым потока.

На Ваш звонок getline (std::cin, name);, поток будет содержать «Симха Верма \ nJai Симха Верма \ п», но getline(); прекращает чтение на первом символа новой строки (она извлечет его, но не добавлять его в name), поэтому он устанавливает name к «Симхе Верме» (включая ведущее место).

После этого (непрочитанное) содержание std::cin будет «Jai Simha Verma \ n».

Я не уверен, какое поведение вам бы хотелось, поэтому я не могу предложить, как этого добиться, а я просто объяснил, что происходит.