试题编号: | 201403-3 |
试题名称: | 命令行选项 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。 输入格式 输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。 输出格式 输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。 样例输入 albw:x 样例输出 Case 1: -a -l |
自己写的错误代码:
#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;
}
}