C ++ stringstream:无论字符串是否以空格结尾,都一致地提取?

时间:2015-11-18 22:50:34

标签: c++ stringstream

std::stringstream中提取未知数量项目的最简单方法是什么,无论字符串末尾是否有空格,其行为都是一致的?

这是一个测试两种略有不同的方法的例子,以显示我的意思:

#include <cstdio>
#include <sstream>
#include <vector>
using namespace std;

void parse1(const char* text)
{
    stringstream text_stream(text);
    vector<string> string_vec;
    char temp[10];

    while (text_stream.good())
    {
        text_stream >> temp;
        printf("%s ", temp);
        string_vec.push_back(temp);
    }
    printf("\n");
}

void parse2(const char* text)
{
    stringstream text_stream(text);
    vector<string> string_vec;
    char temp[10];

    while (text_stream.good())
    {
        text_stream >> temp;
        if (text_stream.good()) 
        {
            printf("%s ", temp);
            string_vec.push_back(temp);
        }
    }
    printf("\n");
}

int main()
{
    char text1[10] = "1 2 3 ";
    char text2[10] = "1 2 3";

    printf("\nMethod 1:\n");
    parse1(text1);
    parse1(text2);

    printf("\nMethod 2:\n");
    parse2(text1);
    parse2(text2);
}

此代码生成以下输出。请注意,他们每个人都在两种情况中的一种情况下搞砸了:

Method 1:
1 2 3 3
1 2 3

Method 2:
1 2 3
1 2

2 个答案:

答案 0 :(得分:1)

在循环条件中,在尝试读取任何内容之前,您正在检查流中的错误:

c_derived::w

应该按相反的顺序进行。惯用,像这样:

../../../../cmdshell.aspx

没有必要谈论第二个版本,它基于同样的错误。

答案 1 :(得分:0)

试试这个:

 void parse3(const std::string& text)
 {
   std::vector<std::string> string_vec;
   std::stringstream text_stream(text); 
   std::string temp;
   while ( text_stream >> temp)
   {
     std::cout<<temp<<" ";
     string_vec.push_back(temp);
   }
   std::cout<<std::endl; 
 }