题目的主要信息:
已知参数有:
- 命令字xcopy
- 字符串/s
- 字符串c:\
- 字符串d:\e
请编写一个参数解析程序,实现将命令行各个参数解析出来。需要注意的是,引号内的参数为一个整体。
方法一:
遍历一遍字符串,用向量ans暂存参数。如果当前字符不在引号内,且当前字符不是空格,表示当前正在参数内部,遍历直至到达空格,将参数拼接起来存入向量中;如果当前字符在引号内,则一直按字符拼接参数,直至到达另一个引号,将引号内的参数整个存入向量中。最后输出ans中的所有参数。
具体做法:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(){
string s;
while(getline(cin,s)){
vector<string> ans;
int flag=0;
string temp;
for(int i=0;i<s.size();i++){
if(flag){//当前位置在引号内,参数为一整个
if(s[i]!='\"'){
temp+=s[i];
}else flag=0;//结束引号
}else{
if(s[i]==' '){//保存当前解析的参数
ans.push_back(temp);
temp.clear();
}else if(s[i]=='\"'){//进入引号
flag=1;
}else{//解析当前参数
temp+=s[i];
}
}
}
ans.push_back(temp);//保存最后一个参数
cout<<ans.size()<<endl;
for(auto a:ans) cout<<a<<endl;
}
}
复杂度分析:
- 时间复杂度:,需要遍历一遍输入的字符串。
- 空间复杂度:,最坏情况下,有个参数。
方法二:
首先遍历一遍字符串,统计其中空格的个数(不包含引号内的),由于最后一个参数后面是没有空格的,所以统计出来的会比实际少一个,输出的时候要加上1。再遍历一遍字符串,如果当前字符不在引号内且不为空格,直接输出;如果当前字符是空格,说明这一个参数输出完成,输出换行符;如果当前字符在引号内,遇到空格不换行,直到遇到后引号,输出完整个参数。
具体做法:
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
while(getline(cin,str)){
//统计个数
int len = str.size();
int num = 0;
for(int i=0; i<len; i++){
if(str[i] == '"'){//引号内的内容当成整体的一个参数
i++;
while(str[i]!='"'){
i++;
}
}
else if(str[i] == ' '){//遇到空格说明前面是一个参数
num++;
}
}
cout<<num+1<<endl;//最后一个参数后没有空格,所以要加上1
//输出
for(int i=0; i<len; i++){
if(str[i] == '"'){//输出引号内的参数
i++;
while(str[i]!='"'){
cout<<str[i];
i++;
}
}else if(str[i] ==' '){//表示一个参数已经输出完成
cout<<endl;
}else{
cout<<str[i];//输出正在遍历的参数
}
}
cout<<endl;
}
return 0;
}
复杂度分析:
- 时间复杂度:,需要遍历一遍输入的字符串。
- 空间复杂度:,只用了常数空间。