描述
在命令行输入如下命令:
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 <= s <= 1000
进阶:时间复杂度:O(n),空间复杂度:O(n)。
输入描述:
输入一行字符串,可以有空格
输出描述:
输出参数个数,分解后的参数,每个参数都独占一行
示例1
输入:
xcopy /s c:\\ d:\\e
输出:
4 xcopy /s c:\\ d:\\e
#include <iostream>
#include <vector>
using namespace std;
int main()
{
string input;
getline(cin, input);
int len = input.length();
//双引号标记,奇数为内容开始,偶数为结束,每遍历到双引号就++
int flag = 0;
string tempField;
vector<string> str;
int count = 0; //每push_back一次,++
for(int i = 0; i < len; i++)
{
//没遇到双引号或者双引号已结束
if(flag%2 == 0)
{
//只要不是空格或者双引号,就连接字符串
if(input[i] != ' ' && input[i] != '"')
{
tempField += input[i];
//最后一个如果是字符直接把临时字符串push_back
if(i == len-1)
{
str.push_back(tempField);
tempField.clear();
count++;
}
}
//遍历到空格或者双引号,将存储的临时字符串push_back
//如果是双引号,标记++
else
{
if(input[i] == '"')
flag++;
if(!tempField.empty())
{
str.push_back(tempField);
tempField.clear();
count++;
}
}
}
//存储的标记为奇数,则开始连接字符
//直到再遇到下一个双引号为止
else
{
if(input[i] != '"')
tempField += input[i];
else
{
flag++;
str.push_back(tempField);
tempField.clear();
count++;
}
}
}
cout << count << endl;
for(vector<string>::iterator itr = str.begin(); itr != str.end(); itr++)
cout << *itr << endl;
return 0;
}