题目描述
在命令行输入如下命令:
xcopy /s c:\ d:\
各个参数如下:
参数1:命令字xcopy
参数2:字符串/s
参数3:字符串c:
参数4: 字符串d:
请编写一个参数解析程序,实现将命令行各个参数解析出来。
解析规则:
- 1.参数分隔符为空格
- 2.对于用“”包含起来的参数,如果中间有空格,不能解析为多个参数。比如在命令行输入xcopy /s “C:\program files” “d:\”时,参数仍然是4个,第3个参数应该是字符串C:\program files,而不是C:\program,注意输出参数时,需要将“”去掉,引号不存在嵌套情况。
- 3.参数不定长
- 4.输入由用例保证,不会出现不符合要求的输入
输入描述:
输入一行字符串,可以有空格
输出描述:
输出参数个数,分解后的参数,每个参数都独占一行
示例1 输入
xcopy /s c:\ d:\
输出
4 xcopy /s c:\ d:\
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str;
while(getline(cin, str))
{
//先统计输出参数的个数
int count = 0;
int size = str.size();
for(int i = 0; i < size; ++i)
{
if(str[i] == ' ')
count++;
//对‘”’进行特殊处理
if(str[i] == '"')
{
do{
i++;
}while(str[i] != '"');
}
}
cout << count+1 << endl;
//用flag表示是否含双引号,0表示有双引号
//注意:双引号中的空格要打印出来
//这里采用异或来操作flag的值, 两个双引号可以使其复原
int flag = 1;
for(int i = 0; i < size; ++i)
{
//有双引号,flag通过异或变为0,下一次再遇到双引号flag变为1
if(str[i] == '"')
flag ^= 1;
//打印有效元素
if(str[i] != ' ' && str[i] != '"')
cout << str[i];
//打印双引号内的空格,是否有双引号已用flag标记
if(str[i] == ' ' && (!flag))
cout << str[i];
//遇到双引号外面的就换行
if(str[i] == ' ' && flag)
cout << endl;
}
cout << endl;
}
return 0;
}