首页 > 试题广场 >

参数解析

[编程题]参数解析
  • 热度指数:155357 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

在命令行输入如下命令:

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

输入

xcopy /s c:\\ d:\\e

输出

4
xcopy
/s
c:\\
d:\\e
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
	string str;
	while (getline(cin, str)) {
		bool flag = false;
		vector<string> vec;
		string row;
		for (int i = 0; i < str.size(); i++) {
			if (flag) {//在括号内
				if (str[i] != '\"') row += str[i];
				else flag = false;
			} else {
				if (str[i] == ' ') {
					vec.push_back(row);
					row = "";
				} else if (str[i] == '\"') flag = true;
				else row += str[i];
			}
		}
		vec.push_back(row);
		cout << vec.size() << endl;
		for (auto i : vec) cout << i << endl;
	}
	return 0;
}

发表于 2016-08-18 09:48:43 回复(9)
20ms 276K
啥都不说,都在代码里了
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Stack;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		String str = sc.nextLine();
		char[] charArray = str.toCharArray();
		List<String> list = new ArrayList<String>();
		//未遇到引号,标志位设为false
		boolean isleftyinhao = false;
		String temp = "";
		for(int i = 0; i < charArray.length; i++){
			//如果遇到引号,且此时左引号标志位为false,那么判断此引号为左引号
			if(charArray[i] == '\"' && !isleftyinhao){
				isleftyinhao = true;
				continue;
			}
			//如果遇到引号,且此时左引号标志位为true,那么判断此引号为右引号
			if(charArray[i] == '\"' && isleftyinhao){
				isleftyinhao = false;
				continue;
			}
			//遇到引号间空格的情况
			if(charArray[i] == ' ' && isleftyinhao){
				temp += charArray[i];
				continue;
			}
			//遇到正常空格的情况
			if(charArray[i] == ' '){
				list.add(temp);
				temp ="";
				continue;
			}
			//其他情况
			temp += charArray[i];
		}
		//将最后一个加上
		list.add(temp);
        
        //输出
		System.out.println(list.size());
		for(int i = 0; i < list.size(); i++){
			System.out.println(list.get(i));
		}
	    
	}
	
} 


编辑于 2016-05-15 22:18:55 回复(9)
#include <iostream>
#include <string>
#include <vector>

using namespace std;

void cmdExplain(const string & str)
{
    string temp = "";
    vector<string> svec;
    int size = str.size();
    int flag = 0;
    for(int i = 0; i< size; i++)
    {
        if('"' == str[i])
        {
            flag = ~flag;  // flag 为0 则变为1表示现在第一次出现了“ ,为1,则变为0表示“抵消了
        }
        else if(' ' == str[i]  && 0 == flag)
        {
           svec.push_back(temp);
           temp = "";
        }
        else
            temp += str[i];
    }
    svec.push_back(temp);  // 别忘记最后一个temp
    int t = svec.size();
    cout << t << endl;
    for(int i = 0; i < t;i++)
        cout << svec[i] << endl;
}



int main()
{
    string str;
    while(getline(cin,str))
    {
        cmdExplain(str);
    }
}

发表于 2017-07-15 16:56:19 回复(2)
输入用例分为两种情况:一种是没有引号单独括起来的命令,全部都是使用空格分开的,这样很简单;还有一种是有双引号括起来的命令;对于第二种情况来说就不能简单的使用空格来分开输入用例了;
这里我的解法是:先使用双引号来隔开命令,这样一来,生成的字符串数组的所有奇数位置都是双引号括起来的命令,因为只有遇到双引号才隔开嘛,然后就对索引的奇偶性进行判断考虑使用空格隔开即可
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* designed by chengxi
**/
public class Main{
	
	public static void main(String[] args) throws IOException{
		
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		String str[] = bf.readLine().split("\"");
		int cnt = 0;
		String res[] = new String[10000];
		for(int i=0; i<str.length; i++){
			str[i] = str[i].trim();
			if((i+1)%2 == 0){
//				System.out.println(str[i]);
				res[cnt++] = str[i];
				continue;
			}
			else{
				String temp[] = str[i].split(" ");
				for(int j=0; j<temp.length; j++)
//					System.out.println(temp[j]);
					res[cnt++] = temp[j];
			}
		}
		
		System.out.println(cnt);
		for(int i=0; i<cnt; i++){
			System.out.println(res[i]);
		}
		bf.close();
	}
}

发表于 2017-09-14 10:28:43 回复(0)
import java.util.Scanner;
import java.util.ArrayList;
public class Main{
    
    public static void main(String[] args){
        
        Scanner sc=new Scanner(System.in);
        
        while(sc.hasNext()){
            
            String str=sc.nextLine();
            ArrayList<Integer> odd=new ArrayList<Integer>();
            ArrayList<Integer> even=new ArrayList<Integer>();
            String[] ss=str.split(" ");
           
            
           
            for(int i=0;i<ss.length;i++){
                
              
                if(ss[i].charAt(0)=='"' && ss[i].charAt(ss[i].length()-1)=='"'){
                        
                    ss[i]=ss[i].substring(1,ss[i].length()-1);
                }else if( ss[i].charAt(0)=='"' && ss[i].charAt(ss[i].length()-1)!='"'  ){
                    
                    odd.add(i);
                    
                }else if(  ss[i].charAt(0)!='"' && ss[i].charAt(ss[i].length()-1)=='"' ){
                    
                    even.add(i);
                    
                    
                }
                

            }
            
            
            if(odd.isEmpty()){
            
            String result="";
                result+=ss.length+"\n";
                for(int i=0;i<ss.length;i++){
                    
                    result+=ss[i]+"\n";
                    
                }
                System.out.println(result.trim());
            }else{
                
                String result1="";
                int num=0;
                int next=0;
       //         result+=ss.length+"\n";
                for(int i=0;i<ss.length;i++){
                    
                    if(odd.get(next)==i){
                        
                        String tmp="";
                            
                        for(int k=i;k<=even.get(next);k++){
                            tmp+=ss[k];
                        }
                        
                        
                        result1+=tmp.substring(1,tmp.length()-1)+"\n";
                        
                        i=even.get(next);
                        next++;
                    }else{
                        
                        result1+=ss[i]+"\n";
                        
                        
                    }
                    
                }
                
                
                String result=num+"\n"+result1;
                
                System.out.println(result.trim());
            }
            
            
        }
        
        
        
        
        
        
    }
    
    
    
    
    
    
    
    
    
    
    
    
}
发表于 2017-07-09 22:57:28 回复(0)
#include <iostream>
#include <string>
#include <queue>

using namespace std;

int main(){
    string str;

    while (getline(cin, str)) {
        queue<string> que;
        int l = 0, r = 0;
        int p = 0;
        bool flag = false;
        for (int k = 0; k < str.length(); k++) {
            if (str[k] == '"') {
                if (!flag) {            // 遇到左引号
                    flag = true;
                } else {                // 遇到右引号
                    flag = false;
                    que.push(str.substr(p, k - p));         // 截取 左引号 与 右引号 之间的字符串
                }
                p = k + 1;              // 跳过引号
            } else if (str[k] == ' ' && !flag) {            // 遇到空格,若再次之前遇到过左引号(即空格在引号内),则不处理
                if (k != p) {
                    que.push(str.substr(p, k - p));
                }
                p = k + 1;              // 跳过空格
            } else if (k == str.length() - 1) {             // 考虑到整个字符串的结束方式
                que.push(str.substr(p, k - p + 1));
            }
        }

        cout << que.size() << endl;
        while(!que.empty()) {
            cout << que.front() << endl;
            que.pop();
        }
    }

    return 0;
}

发表于 2017-06-19 22:56:01 回复(1)
array = input().split()
print(len(array))
for i in array:
    print(i)

python3 solution

发表于 2017-09-06 15:23:40 回复(8)
import re


params = list(re.finditer(r'([^ "]+)|(".+?")', input()))
print(len(params))
for p in params:
    print(p.group().strip('"'))

发表于 2020-12-13 00:08:39 回复(0)
//题目的测试用例有问题,下面的三个if只会进入最后一个
//测试用例中应该没有“C:\program files” 这种情况存在
#include <iostream>
#include <string>
#include <vector>
 
using namespace std;
 
int main(){
    vector<string> mystr;
    string tmp;
     
    while(cin>>tmp){
        mystr.push_back(tmp);
    }
     
    string each;
    string eve;
    cout<<mystr.size()<<endl;
    for(int i=0;i<mystr.size();i++){
        each=mystr[i];
        int a=each.size();
        if(each[0]=='\"')
            eve=each.substr(1,a-2);
        else if(each[a-1]=='\"'){
            eve=eve+' '+each.substr(0,a-2);
            cout<<eve<<endl;
            eve.clear();
        }
        else
            cout<<each<<endl;
    }
    return 0;
     
}

发表于 2017-08-05 17:38:53 回复(3)
看代码吧,注释很详细了,不清楚留言。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
            // 1.输入内容
            String content = sc.nextLine(); // 注意:此处是输入的行
            String regex = "\".*?\""; // 此处使用非贪婪的做法 .*? , 即找到下一个引号' " ',此处匹配 "xxxx"
            String replaceStr = "####"; // 定义占位 字符串中的 "xxxx"

            // 2.将 "xxxx" 替换为 #### 然后按 空格 拆分数组
            String[] strs = content.replaceAll(regex, replaceStr).split("\\s"); // 此处使用 占位字符串 “####” 替换 "xxxx",并按空格拆分数组
            Matcher m = Pattern.compile(regex).matcher(content);
            
            // 3.注意此处是关键:找出字符串中的第 x 个“xxxx”替换数组strs中的第 x 个 ####
            while(m.find()) {
                String temp = m.group().replaceAll("\"", ""); // 去掉 “xxxx”中的 双引号
                for(int i=0; i<strs.length; i++) {
                    if(replaceStr.equals(strs[i])) {
                        strs[i] = temp;
                        break;
                    }
                }
            }
            
            // 4.输出结果
            System.out.println(strs.length);
            for(String str : strs) {
                System.out.println(str);
            }
        }
    }
}


发表于 2022-04-24 21:07:39 回复(0)
package test;
import java.util.Scanner;
public class Test25 {
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();
        int count = 0;
        for(int i = 0; i < str.length(); i++){
            if(str.charAt(i) == '"'){
                do{
                    i++;//排除掉双引号里面的空格
                }while(str.charAt(i) != '"');
            }
            if(str.charAt(i) == ' '){
                count++;
            }
        }
        System.out.println(count+1); //+1是两字符串间隔一个空格
        int flag = 1;  // 定义一个条件来判断是否是再双引号里面
        for(int i = 0; i < str.length(); i++){
            if(str.charAt(i) == '"'){
                flag ^= 1;  // 异或为0
            }
            //输出除了双引号中的空格 或 双引号, 其它字符都输出
            if(str.charAt(i) != ' ' && str.charAt(i) != '"'){
                System.out.print(str.charAt(i));
            }
            //输出双引号里面的空格字符
            if(str.charAt(i) == ' ' && flag == 0){
                System.out.print(str.charAt(i));
            }
            //碰到双引号外面的空格,需要换行输出
            if(str.charAt(i) == ' ' && flag == 1){
                System.out.println();
            }
        }
    }
}

发表于 2022-04-11 16:12:37 回复(0)
#include<iostream>
using namespace std;
#include<string>
#include<vector>

void cmdlineParse(string str)
{
    string tmp;
    vector<string> vs;
    bool flag = false;
    for(int i=0;i<str.length();++i)
    {
        if(str[i]=='"')
        {
            flag = !flag;
        }
        else if(str[i]==' ' && !flag)
        {
            vs.push_back(tmp);
            tmp = "";
        }
        else{
            tmp += str[i];
        }
    }
    vs.push_back(tmp);
    cout<<vs.size()<<endl;
    for(int i=0;i<vs.size();++i)
        cout<<vs[i]<<endl;
}


int main()
{
    string str;
    while(getline(cin,str))
    {
        cmdlineParse(str);
    }
    
    return 0;
}

发表于 2021-10-27 15:51:03 回复(0)
1.对输入的字符串进行截取:
    ①如果是普通不含引号的字符串,通过空格截取
    ②如果含引号,通过‘“’截取
2.截取下来的字符串如果存在引号,就进行去除引号操作。
3.将结果保存进行输出。
#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main()
{
    string recv;
    while(getline(cin,recv))
    {
        vector<string> res;
        for(int i=0;i<recv.size();i++)
        {
            int j=i;
            string str;
            if(recv[j]=='"')
            {
                i++;//注意,必须先让i后移一个单位(因为此时recv[i]=='"'),否则下面的while会直接退出
                while(recv[i]!='"') i++;
                i++;
            }
            else
            {
                while(i!=recv.size()&&recv[i]!=' ') i++;
            }
            str=recv.substr(j,i-j);
            if(str.front()=='"'&&str.back()=='"')  
                str=str.substr(1,str.size()-2);
            res.push_back(str);
        }
        cout<<res.size()<<endl;
        for(auto it:res) cout<<it<<endl;
    }
}


发表于 2021-08-17 22:59:15 回复(0)
import java.util.*;

//双指针
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String s = sc.nextLine();
            List<String> res = new ArrayList<>();
            int i=0, j=0;
            while(j<s.length()){
                if(s.charAt(j)=='"'){//遇到双引号
                    while(j+1<s.length() && s.charAt(j+1)!='"') j++;//移动到双引号末尾
                    res.add(s.substring(i+1, j+1));//加入结果
                    j += 3;//移动指针
                    i = j;
                }else{//字符开始
                    while(j+1<s.length() && s.charAt(j+1)!=' ') j++;//移动到新空格前或字符串末尾
                    res.add(s.substring(i, j+1));
                    j += 2;
                    i = j;
                }
            }
            //输出结果
            System.out.println(res.size());
            for(String str : res){
                System.out.println(str);
            }
        }
    }
}

发表于 2021-08-16 09:34:12 回复(0)
用一个数组记录所有输入的字符串,再用一个set记录所有属于同一参数的字符的索引(不包括最后一个)
输出时,如果字符串的索引可以在set里找到,则空格。若找不到,则换行
#include<iostream>
#include<vector>
#include<string>
#include<set>
using namespace std;
int main(int argc, char** argv){
    int l=0,r=0,i=0;
    string str;
    vector<string> inputs;
    set<int> quotes;
    while(cin>>str){
        if(str[0]=='"' && str[str.size()-1]=='"')
            inputs.emplace_back(str.substr(1,str.size()-2));
        else if(str[0]=='"'){
            l=i;
            inputs.emplace_back(str.substr(1));
        }
        else if(str[str.size()-1]=='"'){
            r=i;
            for(int i=l;i<r;i++) quotes.insert(i);
            inputs.emplace_back(str.substr(0,str.size()-1));
        }
        else inputs.emplace_back(str);
        i++;
    }
    cout<<inputs.size()-quotes.size()<<endl;
    for(int i=0;i<inputs.size();i++){
        cout<<inputs[i];
        if(quotes.find(i)==quotes.end()) cout<<endl;
        else cout<<" ";
    }
    return 0;
}


发表于 2021-05-12 23:06:19 回复(0)
纪念第一次入前一百
这个方法真的很简单!
先判断有没有引号
有的就通过引号分开
关键:被引号分开的都是偶数个,用python的从0开始数就是都是第奇数个。
a=input()
b=[]
if '"' in a:
    a=a.split('"')
    for i in a:
        if a.index(i)%2==0: 
            i=i.split(' ')
            if '' in i:
                del(i[i.index('')])
                b.extend(i)
        else:
            b.append(i)
else:
    b=a.split(' ')
print(len(b))
for x in b:
    print(x)


发表于 2021-02-28 21:33:07 回复(0)
有引号和没引号分开处理,python solution
while True:
    try:
        s = input()
        if '\"' not in s:
            l = s.split()
            print(len(l))
            for ele in l:
                print(ele)
        else:
            l = []
            i = 0
            res = ''
            while i < len(s):
                if s[i] == ' ' and res == '':
                    i += 1
                elif s[i] != '\"':
                    res += s[i]
                    i += 1
                elif s[i] == '\"':
                    if res != '':
                        l += res.split()
                    res = ''
                    temp = ''
                    while i+1 < len(s) and s[i+1] != '\"':
                        temp += s[i+1]
                        i += 1
                    l.append(temp)
                    i += 2
            if res:
                l += res.split()
            print(len(l))
            for ele in l:
                print(ele)
    except:
        break


发表于 2021-02-02 06:33:38 回复(0)
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String str = in.nextLine();
            List<String> res = new ArrayList<>();
            StringBuilder temp = new StringBuilder();
            boolean hasQuote = false;
            for(int i = 0; i < str.length(); i++){
                char c = str.charAt(i);
                //已经有左引号
                if(hasQuote){
                    //遇到右引号
                    if(c == '"'){
                        res.add(temp.toString());
                        temp = new StringBuilder();
                        hasQuote = false;
                    }
                    //未到右引号
                    else{
                        temp.append(c);
                    }
                }
                //没有左引号
                else{
                    //遇到空格
                    if(c == ' '){
                        //此处判断一下是否为空,因为右引号的情况也会添加结果
                        if(!temp.toString().trim().isEmpty()){
                            res.add(temp.toString());
                            temp = new StringBuilder();
                        }
                    }
                    //遇到左括号
                    else if(c == '"'){
                        hasQuote = true;
                    }
                    else{
                        temp.append(c);
                    }
                }
            }
            //最后一个
            if(!temp.toString().trim().isEmpty()){
                res.add(temp.toString());
            }
            System.out.println(res.size());
            //输出结果
            for(String s : res){
                System.out.println(s);
            }
        }
    }
}

发表于 2021-01-09 15:36:27 回复(0)
通过设置左引号出现的标志位来解决
def func():
    param_list = input().strip().split()
    # 设置标志位hasleft代表已经出现了左引号,初始化为False
    hasleft = False
    res = []  # 结果列表
    temp = ''  # 用于临时存储引号内的多个段,处理完一个引号段,要及时置空。
    for param in param_list:
        if param.startswith('\"'):
            if param.endswith('\"'):
                res.append(param[1:-1])
            else:
                hasleft = True
                temp += param[1:] + ' '
        else:
            if param.endswith('\"'):
                hasleft = False
                temp += param[:-1]
                res.append(temp)
                temp = ''  # 一个完整的引号内容处理完成,要将临时变量置空,下一次重新使用
            else:
                if hasleft == False:
                    res.append(param)
                else:
                    temp += (param + ' ')
    # 打印结果
    print(len(res))
    for v in res:
        print(v)


if __name__ == '__main__':
    func()

发表于 2020-12-23 15:45:03 回复(0)
#include<stdio.h>
#include<string.h>
main()
{
    char str[1000];
    while(gets(str))
    {
        int len=strlen(str);
        int num=1;
        int flag=0;
        for(int i=0;i<len;i++)
        {
            if(str[i]=='"')flag=(flag+1)%2;
            if(str[i]==' ' && flag==0)
                num++;
        }
        printf("%d\n",num);
        for(int i=0;i<len;i++)
        {
            if(str[i]=='"'){
                flag=(flag+1)%2;
                i++;
            }
            if(str[i]==' ' && flag==0)
                printf("\n");
            else
                printf("%c",str[i]);
        }
    }
    return 0;
}

之前很多代码没去掉引号,单纯的遇到空格就输出,牛客网测试的例子没选好,错的也能过
发表于 2020-09-14 13:20:30 回复(0)