C ++ Stringstream: принимает строку, но не строку, хранящуюся в переменной. Зачем? - PullRequest
1 голос
/ 09 марта 2012

Я пытался разбить входную строку на более мелкие строки, выделенные пробелами. Я нашел этот код от здесь :

stringstream ss ("bla bla");
string s;

while (getline(ss, s, ' ')) {
cout << s << endl;
}

, который работает просто отлично. Однако если я заменю «bla bla» на переменную, содержащую строку:

string userInput;
cin >> userInput;

stringstream ss (userInput);
string s;

while (getline(ss, s, ' ')) {
cout << s << endl;
}

печатается только первое слово / символ / строка. Это почему? Есть ли способ это исправить? Я посмотрел вокруг на некоторые вопросы, касающиеся струнных потоков, но проблема в том, что я действительно не знаю, что я ищу.

Ответы [ 2 ]

8 голосов
/ 09 марта 2012

Ваша проблема не stringstream ss (userInput);, это поведение std::cin.Любой пробел завершит извлечение форматированного пользовательского ввода, поэтому при вводе bla bla one std::string s = "bla" и еще одна строка "bla" будут ждать извлечения.

Usecin >> noskipws >> userInput; вместо. Если вы хотите получить строку, используйте std::getline(std::cin,userInput).Посмотрите на эту маленькую демонстрацию , которая сравнивает std::getline с std::cin::operator>> на вашем входе bla bla:

Источник:

#include <iostream>
#include <string>

int main(){
        std::string userInput;

        std::cout << "Using std::getline(std::cin,userInput) on input \"bla bla\"." << std::endl;
        std::getline(std::cin,userInput);
        std::cout << "userInput contains \"" << userInput << "\"" << std::endl;

        std::cout << "std::cin >> userInput on input \"bla bla\"." << std::endl;
        std::cin >> userInput;
        std::cout << "userInput contains \"" << userInput << "\"" << std::endl;
        return 0;
}

Результат:

Using std::getline(std::cin,userInput) on input "bla bla".
userInput contains "bla bla"
std::cin >> userInput on input "bla bla".
userInput contains "bla"

См. Также:

0 голосов
/ 09 марта 2012

Это делает то, что вы сказали:

#include "stdafx.h"
#include <string>
#include <sstream>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    std::string test("bla bla");
    std::stringstream stream(test);
    std::string temp;
    while (getline(stream, temp, ' ')) {
       std::cout << temp << std::endl;
    }
    return 0;
}

Это даже то, что ты сказал, что сделал. Но так как это работает - в чем разница с вашим кодом?

А для тех, кто не имеет под рукой компилятора Microsoft Visual C ++ и не понимает различий, вот фрагмент кода:

std::string test("bla bla");
std::stringstream stream(test);
std::string temp;
while (getline(stream, temp, ' ')) {
   std::cout << temp << std::endl;
}

Включения, требуемые этим фрагментом: <string>, <sstream> & <iostream>. Пожалуйста, вставьте его в нужный метод.

...