HJ74参数解析
一.题目描述
输出一个个字符串表示一个命令行,在这个命令行中有不同的参数,求参数的个数并且解析出参数。
解析规则:
1.参数分隔符为空格
2.对于用" "包含起来的参数,如果中间有空格,不能解析为多个参数。
3.参数不定长
4.输入由用例保证,不会出现不符合要求的输入
基于解析规则我们可以知道如下两点:
1.空格是参数之间是利用空格进行分割的
2." "中间的也是参数,并且" "中的空格并不分割的,是参数的一部分
二.算法一(模拟)
由于主要区分点在于空格和引号,所以我们只需要区分引号和空格并且做好对每一个参数的记录,下面是完整代码和注释:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
vector<string>q;
string str="";//用来记录每一个参数
bool ck=true;
while(getline(cin,s)){//一行进行读入
str="";
for(int i=0;i<s.size();i++){
if(!ck){
//ck=false表示目前是在" "中记录参数
if(s[i]!='"'){
str+=s[i];
} else {
ck=true;
q.push_back(str);
str="";
}
continue;
}
//对空格分隔的参数进行处理
if(s[i]!=' '&&s[i]!='"'){
str+=s[i];
} else {
if(s[i]=='"'){
ck=false;
continue;
}
if(str!="")
q.push_back(str);
str="";
}
}
}
//最后一个参数需要记录
if(str!=""){
q.push_back(str);
}
//输出
cout<<q.size()<<endl;
for(int i=0;i<q.size();i++){
cout<<q[i]<<endl;
}
}
时间复杂度:,只需要对输入的字符串进行一次遍历。
空间复杂度:,需要空间去存储参数。
三.算法二(模拟)
可以减少空间的利用率,先对字符串进行遍历统计空格和引号的个数,进而分析出参数个数,然后思路和算法一一样的,直接输出每一个参数不需要对其进行存储,下面是完整代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
vector<string>q;
string str="";//用来记录每一个参数
bool ck=true;
while(getline(cin,s)){//一行进行读入
int cnt=0;
for(int i=0;i<s.size();i++){
if(s[i]=='"'){//进入了引号
i++;
while(s[i]!='"'){
i++;
}
} else if(s[i]==' '){//是个空格就可以说明前面是一个参数
cnt++;
}
}
//最后一个参数的个数需要加一
cout<<cnt+1<<endl;
str="";
for(int i=0;i<s.size();i++){
if(!ck){
//ck=false表示目前是在" "中记录参数
if(s[i]!='"'){
str+=s[i];
} else {
ck=true;
//直接输出参数
for(int k=0;k<str.size();k++){
cout<<str[k];
}
cout<<endl;
str="";
}
continue;
}
//对空格分隔的参数进行处理
if(s[i]!=' '&&s[i]!='"'){
str+=s[i];
} else {
if(s[i]=='"'){
ck=false;
continue;
}
if(str!=""){
//直接输出参数
for(int k=0;k<str.size();k++){
cout<<str[k];
}
cout<<endl;
str="";
}
}
}
}
//最后一个参数需要输出
if(str!=""){
for(int k=0;k<str.size();k++){
cout<<str[k];
}
cout<<endl;
}
}
时间复杂度:,只需要对输入的字符串进行两次遍历。
空间复杂度:,不需要额外空间,直接进行输出。