从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
答案 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;
}