原题链接: 参数解析
题目
在命令行输入如下命令:
xcopy /s c:\ d:\e,
各个参数如下:
参数1:命令字xcopy
参数2:字符串/s
参数3:字符串c:\
参数4: 字符串d:\e
请编写一个参数解析程序,实现将命令行各个参数解析出来。
解析规则:
1.参数分隔符为空格
2.对于用""包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s “C:\program files” "d:“时,参数仍然是4个,第3个参数应该是字符串C:\program files,而不是C:\program,注意输出参数时,需要将”"去掉,引号不存在嵌套情况。
3.参数不定长
4.输入由用例保证,不会出现不符合要求的输入
数据范围:字符串长度:1\le s\le 1000\1≤s≤1000
进阶:时间复杂度:O(n)\O(n) ,空间复杂度:O(n)\O(n)
输入描述:
输入一行字符串,可以有空格
输出描述:
输出参数个数,分解后的参数,每个参数都独占一行
示例1
输入:xcopy /s c:\\ d:\\e
输出:4
xcopy
/s
c:\\
d:\\e
思路
输入一个字符串,遍历字符串,如果不考虑有双引号包着的字符串时,我们只需要对这个字符串的每个字符进行遍历,遇到空格记录个数和之前的值,加了带引号的字符串后,我们碰到空格就不能直接记录了,所以我们便需要引用字符串数组进行记录每一个字符串,最后输出这个字符串数组的长度和它里面所存储的字符串参数
解题步骤
1.进行遍历输入的字符串时,需要定义一个flag用来记录当前是否遇到("),如果遇到了,则将flag置为真
bool flag = false; //用于判断是否处于字符串的状态
for (int i = 0; i < str.size(); ++i)
{
if (str[i] == '"')
{ //判断是否是字符串的起始或者结束
flag = !flag; //说明处于了字符串的状态
}
}
2.当在引号中时,遍历这个字符串中的字符碰到空就不能将当前字符串存入字符串数组中,碰到空格并且不在引号中的字符串中时,就前面的字符串存入到字符串数组中
if (str[i] == ' ' && !flag)
{ //判断参数的分隔或者是否为字符串的内容
svec.push_back(tmp);
tmp = "";
}
3.剩下便是正常情况下遍历字符串
tmp += str[i];
完整代码
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void cmdLineParse(const string& str) {
string tmp = "";
vector<string> svec;
bool flag = false; //用于判断是否处于字符串的状态
for (int i = 0; i < str.size(); ++i)
{
if (str[i] == '"')
{ //判断是否是字符串的起始或者结束
flag = !flag; //说明处于了字符串的状态
} else if (str[i] == ' ' && !flag)
{ //判断参数的分隔或者是否为字符串的内容
svec.push_back(tmp);
tmp = "";
} else
{ //正常的参数内容
tmp += str[i]; //xcopy
}
}
svec.push_back(tmp); //追加最后一个参数
cout << svec.size() << endl;
for (int i = 0; i < svec.size(); ++i)
cout << svec[i] << endl;
}
int main() {
string str;
while (getline(cin, str)) {
cmdLineParse(str);
}
return 0;
}