题解 | #参数解析#
参数解析
http://www.nowcoder.com/practice/668603dc307e4ef4bb07bcd0615ea677
#include <cstring>
#include<iostream>
#include<vector>
using namespace std;
// 参数解析
void split(string str, vector<string>& v){
if(str.empty())
return;
size_t start = str.find('"');
if(start != string::npos){
split(str.substr(0, start), v); // 解析左边不含引号的字符串
size_t end = str.find('"', start+1); // 获取第二个引号的位置
v.push_back(str.substr(start+1, end-start-1)); // 两个引号之间的内容就是一个参数
split(str.substr(end+1), v); // 解析右边的字符串,可能还有引号
}else{
// 如果没有引号,则直接按照空格来分割
char* cstr = new char[str.size()+1];
strcpy(cstr, str.c_str());
char* p = strtok(cstr, " ");
while(p != 0){
v.push_back(string(p));
p = strtok(NULL, " ");
}
}
}
int main(){
vector<string> v;
string str;
getline(cin, str);
// 通过获取'"' 的位置,将字符串分成3部分,先解析引号左边的,然后引号中间的,最后解析引号右边的
split(str, v);
cout << v.size() << endl;
for(auto it = v.begin(); it != v.end(); it++){
cout << *it << endl;
}
return 0;
}