【CCF-CSP】201403-3 命令行选项 C++


一、题目

命令行选项

原题目链接

二、解题

1.步骤

  1. 存储格式字符串:先用string存储整个格式字符串,再用map对各个选项以及选项的参数情况。 true:带参数选项,false不带参数选项
	string line;
	cin>>line;
	map<char,bool> dct;//true:带参数选项,false不带参数选项 
	for(int i=0;i<line.size();i++){
		if(line[i]!=':'){
			dct.insert(pair<char,bool>(line[i],false));
		}else{
			dct[line[i-1]]=true;
		}
	}
  1. 核心
    在输入流对象 ss 中,读取一个字符串数据并存储到变量 temp中,如果读取成功,则进行如下操作:
  • 如果变量 temp 中存储的是带参选项,则读入下一个字符串到arg中。如果读取成功,则进行如下操作:

    • 如果变量temp在 res 容器中已经存在,则更新该键值对的值为 arg。
    • 如果变量 temp 在 res 容器中不存在,则添加一个新的键值对到 res 容器中,其中键为 temp,值为 arg。
  • 如果变量中存储的是不带参选项,则添加一个新的键值对到 res 容器中,其中键为 temp,值为空。

  • 如果无法继续读取字符串数据,则退出循环操作。

		while(ss>>temp){
			if(temp[0] == '-' && dct.find(temp[1])!=dct.end()){ 
				if(dct[temp[1]]){//带参数 
					string arg;
					if(ss>>arg){
						if(res.find(temp)!=res.end()){//数据存在 
							res[temp]=arg;
						}else{//数据不存在 
							res.insert(pair<string,string>(temp,arg));
						}
					}
					else{
						break;
					}
				}
				else{//不带参数 
					res.insert(pair<string,string>(temp,""));
				}
			}
			else{
				break;
			}
		}

2.代码

dev c++ 5.11

// 201403-3 命令行选项
#include<bits/stdc++.h>
using namespace std;
int main(){
	string line;
	cin>>line;
	map<char,bool> dct;//true:带参数选项,false不带参数选项 
	for(int i=0;i<line.size();i++){
		if(line[i]!=':'){
			dct.insert(pair<char,bool>(line[i],false));
		}else{
			dct[line[i-1]]=true;
		}
	}
	int n;
	cin>>n;
	cin.ignore(); //删除输入流中的回车 
	string s;
	map<string,string> res;
	for(i=0;i<n;i++){
		res.clear();//清空字符串中的所有字符 
		string temp;//指令 
		getline(cin,s);//读取一行字符串,遇到回车结束(过滤换行) 
		stringstream ss(s);
		ss>>temp; 
		while(ss>>temp){
			if(temp[0] == '-' && dct.find(temp[1])!=dct.end()){ 
				if(dct[temp[1]]){//带参数 
					string arg;
					if(ss>>arg){
						if(res.find(temp)!=res.end()){//数据存在 
							res[temp]=arg;
						}else{//数据不存在 
							res.insert(pair<string,string>(temp,arg));
						}
					}
					else{
						break;
					}
				}
				else{//不带参数 
					res.insert(pair<string,string>(temp,""));
				}
			}
			else{
				break;
			}
		}
		cout<<"Case "<<i+1<<": ";
		map<string,string>::iterator iter;
		for(iter=res.begin();iter!=res.end();iter++){
			cout<<iter->first<<" ";
			if(iter->second!=""){
				cout<<iter->second<<" ";
			} 
		}
		cout<<endl;
	}
	return 0;
} 

3.提交结果

结果

总结

1.一些解释

		stringstream ss(s);
		ss>>temp;

在这段代码中,第一个从stringstream中提取的字符串会被存储在变量temp中,该单词会包含所有不包含空格的字符,不包括空格本身。一次提取的单词是以空格为分隔符的连续字符序列,因此,如果读取到的字符串是"Hello World",那么temp将存储"Hello"。如果要读取下一个单词,只需再次使用ss>>temp代码即可。这会将下一个单词读取到temp中,以此类推。

2.map中访问元素的一种方式:迭代器访问

		map<string,string>::iterator iter;
		for(iter=res.begin();iter!=res.end();iter++){
			//iter是结构体指针访问,所以用->访问
			cout<<iter->first<<" ";
			if(iter->second!=""){
				cout<<iter->second<<" ";
			} 
		}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值