题目的主要信息:

已知参数有:

  1. 命令字xcopy
  2. 字符串/s
  3. 字符串c:\
  4. 字符串d:\e

请编写一个参数解析程序,实现将命令行各个参数解析出来。需要注意的是,引号内的参数为一个整体。

方法一:

遍历一遍字符串,用向量ans暂存参数。如果当前字符不在引号内,且当前字符不是空格,表示当前正在参数内部,遍历直至到达空格,将参数拼接起来存入向量中;如果当前字符在引号内,则一直按字符拼接参数,直至到达另一个引号,将引号内的参数整个存入向量中。最后输出ans中的所有参数。 alt 具体做法:

#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;
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),需要遍历一遍输入的字符串。
  • 空间复杂度:O(n)O(n),最坏情况下,有O(n)O(n)个参数。

方法二:

首先遍历一遍字符串,统计其中空格的个数(不包含引号内的),由于最后一个参数后面是没有空格的,所以统计出来的会比实际少一个,输出的时候要加上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;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),需要遍历一遍输入的字符串。
  • 空间复杂度:O(1)O(1),只用了常数空间。