201403-3 命令行选项(错误)

试题编号: 201403-3
试题名称: 命令行选项
时间限制: 1.0s
内存限制: 256.0MB
问题描述:

问题描述

  请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。
  选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。
  该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, "ab:m:" 表示该程序接受三种选项,即"-a"(不带参数),"-b"(带参数), 以及"-m"(带参数)。
  命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。

输入格式

  输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。
  输入的第二行是一个正整数 N(1 ≤ N ≤ 20),表示你需要处理的命令行的个数。
  接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。

输出格式

  输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。

样例输入

albw:x
4
ls -a -l -a documents -b
ls
ls -w 10 -x -w 15
ls -a -b -c -d -e -l

样例输出

Case 1: -a -l
Case 2:
Case 3: -w 15 -x
Case 4: -a -b

自己写的错误代码:


#include <map>  
#include <cmath>  
#include <queue>  
#include <cstdio>  
#include <string>  
#include <cstring>  
#include <iostream>  
#include <algorithm> 
#include <sstream> 
#include <time.h> 
#include <vector>
#include <list>
using namespace std;

//201403-3 命令行选项
int Comepare(string x, string y)		//判断x<y,是返回1,否则返回0
{
	int k;
	if (x.length() < y.length())
		return 1;
	else if (x.length() == y.length())
	{
		for (k = 0; k < x.length(); k++)
		{
			if (x[k] < y[k])
				return 1;
			else if(x[k] > y[k])
				return 0;
		}
		return 0;
	}
	else
		return 0;
}
int main()
{
	int i ,j ,N;
	map<char, int>Type;		//0表示没有该命令,1表示带参数命令,2表示不带参数命令
	string s, Order;
	char last;
	cin >> s;
	for (i = 0; i < s.length(); i++)
	{
		if (s[i + 1] == ':')
		{
			Type[s[i]] = 1;
			i++;
		}
		else
			Type[s[i]] = 2;
	}
	cin >> N;
	cin.ignore();					//用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响
	string Out[20];
	map<char, string>Save;			//保存带参数指令最大值
	map<char, int>Flag;				//表示是否(>0/-1)使用过 正数表示参数位置
	Save.clear();
	Flag.clear();
	int num = 0, k = 0 ,p =0;		//num表示输出的字符串位置,k表示带参数的位数
	for (i = 0; i < N; i++)
	{
		getline(cin, Order);
		//cout << Order.length() << endl;
		if (Order.length() > 3)
		{
			for (j = 3; j < Order.length(); )
			{
				if (Order[j] == '-')
				{
					if (!Type[Order[j + 1]])	//非格式命令
					{
						//cout << "非格式命令:" << Order[j + 1] << endl;
						break;
					}
					if (Flag[Order[j + 1]] == 0)		//如果该命令未出现过
					{
						Flag[Order[j + 1]] = 1;		//表示该命令出现过
						if (Type[Order[j + 1]] == 2)
						{
							Save[Order[j + 1]] = "*";
							//cout << Order[j + 1] << "首次出现" << endl;
							j += 3;
						}
						else if (Type[Order[j + 1]] == 1)
						{
							while (j + 3 + k < Order.length() && Order[j + 3 + k] != ' ')		//最末尾为参数时j+3+k会超出界限
							{
								k++;
							}
							Save[Order[j + 1]] = Order.substr(j + 3, k);
							j =j+ 3 + k + 1;
							k = 0;
						}
					}
					else if (Type[Order[j + 1]] == 2)
						j += 3;
					else if (Type[Order[j + 1]] == 1)
					{
						while (j + 3 + k < Order.length() && Order[j + 3 + k] != ' ')
						{
							k++;
						}
						//if (Comepare(Save[Order[j + 1]], Order.substr(j + 3, k)) == 1)
						//{
							Save[Order[j + 1]] = Order.substr(j + 3, k);
						//}
						j += 3 + k + 1;
						k = 0;
					}
				}
				else					//非格式命令退出
					break;
			}
		}
		//每行指令合并
		for (map<char, string>::iterator it = Save.begin(); it != Save.end(); it++)
		{
			string ss;
			Out[i].append("-");			
			ss = (*it).first;
			Out[i].append(ss);
			Out[i].append(" ");

			if ((*it).second != "*")
			{
				Out[i].append((*it).second);
				Out[i].append(" ");
			}

		}
		cout << "Case " << i + 1 << ": " << Out[i] << endl;
		Save.clear();
		Flag.clear();
	}
	//for (i = 0; i < N; i++)
	//{
	//	cout << "Case " << i + 1 << ": " << Out[i] << endl;
	//}
	cin >> N;
	return 0;

}

参考的答案(100分):


//参考答案
int type[26]; // 0:不存在 1:无参数选项 2:有参数选项 
string argument[26];

int main() {
	string patten;
	int last_arg;
	cin >> patten;
	for (int i = 0; i<patten.length(); i++) {

		if (patten[i] == ':') {
			type[last_arg] = 2;
		}
		else {
			last_arg = patten[i] - 'a';
			type[last_arg] = 1;
		}
	}

	int n;
	cin >> n;
	cin.ignore();
	for (int i = 1; i <= n; i++) {
		string temp;
		getline(cin, temp);
		stringstream ss(temp);
		ss >> temp;
		while (ss >> temp) {
			if (temp[0] == '-') {
				int last_arg = temp[1] - 'a';
				if (type[last_arg] == 0) { // 非合法选项 
					break;
				}
				else if (type[last_arg] == 1) {
					argument[last_arg] = " ";
				}
				else if (type[last_arg] == 2) {
					if (ss.eof()) break; // 有参数选项没有输入参数 
					ss >> temp;
					argument[last_arg] = temp;
				}
			}
			else { // 非合法参数
				break;
			}
		}

		cout << "Case " << i << ":";
		for (int j = 0; j<26; j++) {
			if (type[j] == 1 && argument[j] != "") {
				cout << " -" << char(j + 'a');
			}
			if (type[j] == 2 && argument[j] != "") {
				cout << " -" << char(j + 'a') << ' ' << argument[j];
			}
			argument[j] = "";
		}
		cout << endl;
	}
}

猜你喜欢

转载自blog.csdn.net/yanpr919/article/details/81183760
今日推荐