201403-3 命令行选项

思路

字符串处理

实现



#include <iostream>
#include <string>
#include <map>
#include <cstdio>
#include <cctype>

using namespace std;

typedef pair<string, string> PAIR;

bool no_arg_options[30];
bool with_arg_options[30];

struct opts {
	map<string, string> opts_map;
	
	void insert(string opt, string arg) {
		if (opts_map.find(opt) == opts_map.end()) {
			opts_map.insert(std::pair<string, string>(opt,arg));
		} else {
			opts_map[opt] = arg;
		}
	}
	
	void out() {
		string res;
		for (map<string, string>::iterator ite = opts_map.begin();
			 ite != opts_map.end();
			 ++ite) {
			if(ite->second == "") {
				res = res + "-" + ite->first + " ";
			} else {
				res = res + "-" + ite->first + " " + ite->second + " ";
			}
		}
		cout << res;
	}

};

int main() {
	
	string consensus_ops;
	getline(cin,consensus_ops);
	
	for (int i = 0;consensus_ops[i];++i) {
		char &c = consensus_ops[i];
		if (c==':') {
			with_arg_options[consensus_ops[i-1] - 'a'] = true;
			no_arg_options[consensus_ops[i-1] - 'a'] = false;
		} else if (c>='a' && c<='z'){
			no_arg_options[c - 'a'] = true;
		}
	}

	int num;
	scanf("%d\n",&num);
	
	for (int i = 0;i < num;++i) {

		string command;
		opts opts_temp;

		getline(cin, command);
		string::iterator cmd_ite = command.begin();

		/*cmd name*/
		while(cmd_ite!=command.end() && !isspace(*cmd_ite)) {
			++cmd_ite;
		}
		/*skip space*/
		++cmd_ite;
		while(cmd_ite!=command.end()) {
			/* begin with - */
			if (*cmd_ite++ == '-') {
				char option_ch = *cmd_ite;
				++cmd_ite;
				
				// illegal option
				if (cmd_ite == command.end() 
					|| !isspace(*cmd_ite) 
					|| option_ch < 'a' 
					|| option_ch > 'z') {
					break;
				}

				if (no_arg_options[option_ch - 'a']) {
					string opt(1,option_ch);
					opts_temp.insert(opt,"");
					++cmd_ite;
				} else if (with_arg_options[option_ch - 'a']) {
					string opt(1,option_ch);
					++cmd_ite;

					// legal arg
					string arg;
					arg.clear();
					while (cmd_ite!=command.end() && !isspace(*cmd_ite)) {
						if ((*cmd_ite>='a'&&*cmd_ite<='z')
							||(*cmd_ite>='0'&&*cmd_ite<='9')
							||(*cmd_ite=='-')) {
							arg = arg + string(1,*cmd_ite);	
						} else {
							goto end; 
						}
						++cmd_ite;
					}
					if (arg.empty()) {
						goto end;
					}
					opts_temp.insert(opt,arg);
					
					if(!isspace(*cmd_ite)) {
						break;
					}
					++cmd_ite;
				} else {
					break;
				}
			} else { 
				break;
			}
		}
		end:;

		cout << "Case " << i + 1 << ": ";
		opts_temp.out();
		printf("\n"); 	
	}
	
}

/*

		while (cmd_ite!=command.end() && *cmd_ite != ' ' && *cmd_ite != '\t') {
			++cmd_ite;
		}
		++cmd_ite;
	
		while (cmd_ite !=command.end() ) {
			if (*cmd_ite++ == '-') {
				if (no_arg_options[*cmd_ite-'a']) {
					if (cmd_ite!=command.end() && *(cmd_ite + 1) != ' ' && *(cmd_ite + 1) != '\t') {
						break;
					}
					string opt(1,*cmd_ite);
					opts_temp.insert(opt,"");
				} else if (with_arg_options[*cmd_ite-'a']) {
					string opt(1,*cmd_ite);
					if (cmd_ite!=command.end() && *(cmd_ite + 1) != ' ' && *(cmd_ite + 1) != '\t') {
						break;
					}
					++cmd_ite;
					while (cmd_ite!=command.end() && (*cmd_ite == ' ' || *cmd_ite == '\t')) {
						++cmd_ite;
					};
					string arg;
					while (cmd_ite!=command.end() && *cmd_ite != ' ' && *cmd_ite != '\t') {
						if ((*cmd_ite>='a'&&*cmd_ite<='z')
							||(*cmd_ite>='0'&&*cmd_ite<='9')
							||(*cmd_ite=='-')) {
							arg = arg + string(1,*cmd_ite);	
						} else {
							goto end; 
						}
						++cmd_ite;
					}
					if (arg.empty()) {
						goto end;
					}
					opts_temp.insert(opt,arg);
				} else {
					break;
				}
			} else {
				break;
			}
			++cmd_ite;
			while (cmd_ite!=command.end() && (*cmd_ite == ' '||*cmd_ite == '\t') ) {
				++cmd_ite;
			}
			if (cmd_ite==command.end()) {
				break;
			}
		}
		end:;
		

*/


posted @ 2020-08-21 23:24  amonqsq  阅读(113)  评论(0编辑  收藏  举报