Проблема в том, что cin >> word
будет читать только в первом слове.Если вы хотите работать с одним целым одновременно, вы должны использовать std::getline
.
Например:
std::string s;
std::getline(std::cin, s);
s = space2underscore(s);
std::cout << s << std::endl;
Также вы можете захотетьпроверьте, что вы действительно смогли прочитать строку.Вы можете сделать это следующим образом:
std::string s;
if(std::getline(std::cin, s)) {
s = space2underscore(s);
std::cout << s << std::endl;
}
Наконец, как примечание, вы, вероятно, могли бы написать свою функцию более понятным способом.Лично я написал бы это так:
std::string space2underscore(std::string text) {
for(std::string::iterator it = text.begin(); it != text.end(); ++it) {
if(*it == ' ') {
*it = '_';
}
}
return text;
}
Или для бонусных баллов используйте std::transform
!
РЕДАКТИРОВАТЬ: Если это произойдетчтобы быть достаточно удачливым, чтобы иметь возможность использовать функции c ++ 0x (и я знаю, что это здорово, если), вы можете использовать лямбда-выражения и std::transform
, что приводит к некоторому очень простому коду:
std::string s = "hello stackoverflow";
std::transform(s.begin(), s.end(), s.begin(), [](char ch) {
return ch == ' ' ? '_' : ch;
});
std::cout << s << std::endl;