2013-02-19 4 views
1

Так что я написал эту очень простую программу:CIN, Пробелы и «буферное»

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
string input; 

cin >> input; 
cout<< input<<endl; 
cin >> input; 
cout<< input<<endl; 
cin >> input; 
cout<< input<<endl; 
return 0; 
} 

я типа в «word1 word2 word3» на одной линии и выход, как ожидается, является

word1 
word2 
word3 

прямо сейчас конечно, я мог бы получить тот же результат, что и for (int i=0; i <3; i++){cin>>input; cout << input<<endl;}.

Это подводит меня к моему вопросу. Как только cin иссякнет, чтобы читать с stdin, он будет запрашивать пользователя (stdin).

Я пытаюсь определить, будет ли cin читать что-нибудь из stdin buffer или запросить пользователя.

Я знаю его простой вопрос, но его для домашней работы ... и я нахожусь в огромном трудовом времени, крещенном, так что хвалиться тем, кто разделяет власть!

+2

Если я правильно понял ваш вопрос правильно, вы хотите 'то время как (Std :: cin >> input) std :: cout << input << '\ n'; '... –

+0

Как вы хотите отличаться от того, что получаете? –

+0

Я, очевидно, не очень хорошо это сказал ... Мне нужно прочитать все аргументы между пробелами от исходного ввода, а затем прекратить чтение после того, как все аргументы будут прочитаны - когда * Я не знаю, сколько аргументы, которые я получу. * Спасибо, хотя! – user1833028

ответ

2

То, что вы пытаетесь сделать, не может быть выполнено с помощью operator>> только потому, что оно не различает разные типы пробелов. Посмотрите на реализацию в вашей любимой стандартной библиотеки C++, следующий из GCC 4.7.2 (в bits/basic_string.tcc):

995 // 21.3.7.9 basic_string::getline and operators 
996 template<typename _CharT, typename _Traits, typename _Alloc> 
997  basic_istream<_CharT, _Traits>& 
998  operator>>(basic_istream<_CharT, _Traits>& __in, 
999   basic_string<_CharT, _Traits, _Alloc>& __str) 
1000  { 
... 
1027   while (__extracted < __n 
1028    && !_Traits::eq_int_type(__c, __eof) 
1029    && !__ct.is(__ctype_base::space, 
1030     _Traits::to_char_type(__c))) 
1031   { 

Как вы можете видеть, (строка 1029), это останавливается на всех пробельных встречаются (см http://en.cppreference.com/w/cpp/locale/ctype_base для ctype_base::space).

То, что вы хотите сделать, поэтому использовать getline (который останавливается, когда он сталкивается с новой строки) и извлекать с помощью stringstream:

getline(cin,mystring); 
stringstream str(mystring); 
while (str >> token) { 
    cout << token << '\n'; 
} 
+0

Это эффективное решение, столь же изящное, как я надеялся. Спасибо. Любопытный может пожелать изучить это: http://stackoverflow.com/questions/236129/splitting-a-string-in-c – user1833028

Смежные вопросы