C ++ Stringstream:接受一个字符串,但不接受存储在变量中的字符串。为什么?

时间:2012-03-09 09:30:12

标签: c++ stringstream

我一直在尝试将输入字符串拆分为由空格描绘的较小字符串。我从here找到了这段代码:

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;
}

只输出第一个单词/ char / string。这是为什么?有办法解决吗?我已经查看了一些字符串流问题,但问题是我真的不知道我在寻找什么。

2 个答案:

答案 0 :(得分:8)

您的问题不是stringstream ss (userInput);,而是std::cin的行为。任何空格都将结束格式化用户输入的提取,因此输入bla bla将导致一个 std::string s = "bla"和另一个字符串"bla"等待提取。

改为使用cin >> noskipws >> userInput;如果您想获得一行,请改用std::getline(std::cin,userInput)。看看这个小demonstration,它会在您的输入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"

另见:

答案 1 :(得分:0)

这就是你所说的:

#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>&amp; <iostream>。请将其插入所需的方法。