ccf命令行选项只能用c实现_【ACM】CCF-201403-3 命令行选项 模拟

博主分享CCF考试经历,第一题仅得10分,第二题轻松解决,第三题字符串替换耗时久且出错,第四题图论题得分低,第五题未细看。还给出命令行分析程序的问题描述、输入输出格式及样例,最后展示了用C语言实现的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先请允许我吐个槽。。。CCF的槽点简直太多了。。。以下就是我的分数。。。我对不起学了三年的所有编程老师。。。。 第一题不知道是因为看错题还是判错,签到题只对了10分。一般误判比较少,估计只能是我哪里理解错题意,因为第一题是送分的,所以真的真的很可惜。我姑且认为造成这个的而直接原因就是这个不像OJ一样可以实时查看提交结果,等到成绩下来已经晚了,这点就是CCF最不人性的地方。后面第二题是一个简单的日历题目,刷刷刷10分钟解决战斗。第三题是一个字符串替换题。题目看似不难,CCF所有的模拟类题目做起来都挺不简单,容易错还耗时,这道题我就做了2小时(渣,唉),考试时要有心理准备。字符串替换题我是错在了字符串不能递归替换这里,最后才发现这一点,但是时间已经来不及了,更何况牵一发而动全身,给80分还是很良心的。第四题是考察图论,考的是有向图的强连通分量。这个还是看在前面有一点ACM基础,否则只按照学的准备应该覆盖不到这个范围。我当时写的时候是照着60%的用例写的程序,当然也出乎意料只对了30%的测试用例,具体原因就不知道了,因为后40%的用例确实比较大,得用优化但是看起来比较麻烦。第五题因为时间就没仔细看了。。 周五还有最后的一次机会,但是还是需要准备的更充分一点。话说CCF的盲提交确实很烦,需要一再注意细节才可以,需要一再注意细节才可以,需要一再注意细节才可以! 问题描述

请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。

选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。

该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, "ab:m:" 表示该程序接受三种选项,即"-a"(不带参数),"-b"(带参数), 以及"-m"(带参数)。

命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。输入格式

输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。

输入的第二行是一个正整数 N(1 ≤ N ≤ 20),表示你需要处理的命令行的个数。

接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。输出格式

输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。样例输入albw:x4ls -a -l -a documents -blsls -w 10 -x -w 15ls -a -b -c -d -e -l样例输出Case 1: -a -lCase 2:Case 3: -w 15 -xCase 4: -a -b

1 #include

2 #include

3 #define LOCAL

4 struct mark {

5

char name;

6

int argu;

7

int taken;

8

char argustr[256];

9

void print() { 10

if(taken==1) { 11

printf("-%c ",name); 12

if(argu==1) { 13

printf("%s ",argustr); 14

} 15

} 16

} 17 };//输入之后按照name排序 18 int hash[30]; 19 char markstr[54]; 20 mark markarr[30]; 21 int n; 22 char *delim = " "; 23 char rb; 24 int main() { 25 #ifdef LOCAL 26

freopen("data.in","r",stdin); 27 #endif 28

scanf("%s",markstr); 29

for(int i=0; i<30; i++) { 30

markarr[i].name='\0'; 31

markarr[i].argu=0; 32

markarr[i].taken=0; 33

memset(markarr[i].argustr,'\0',sizeof(markarr[i].argustr)); 34

} 35

int id=0; 36

for(int i=0; i

markarr[id].name=markstr[i]; 38

if(i!=strlen(markstr)-1) { 39

if(markstr[i+1]==':') { 40

markarr[id].argu=1; 41

i++; 42

} 43

} 44

id++; 45

} 46

scanf("%d",&n); 47

char input[260]; 48

char *p; 49

for(int i=0; i

51

for(int i=0; i<30; i++) { 52

markarr[i].name='\0'; 53

markarr[i].argu=0; 54

markarr[i].taken=0; 55

memset(markarr[i].argustr,'\0',sizeof(markarr[i].argustr)); 56

} 57

int id=0; 58

for(int i=0; i

markarr[id].name=markstr[i]; 60

if(i!=strlen(markstr)-1) { 61

if(markstr[i+1]==':') { 62

markarr[id].argu=1; 63

i++; 64

} 65

} 66

id++; 67

} 68

printf("Case %d: ",i+1); 69

memset(hash,-1,sizeof(hash)); 70

scanf("%c",&rb); 71

scanf("%[^\n]",&input); 72

p=strtok(input, delim); 73

int bomb=0; 74

while((p = strtok(NULL, delim))) { 75

if(bomb==1) break; 76

//这里对其进行解析,遍历所有的看是否有匹配,如果有多进行一轮strtok 77

if(p[0]=='-'&&strlen(p)==2) { 78

int bomb2=0; 79

for(int j=0; j

if(p[1]==markarr[j].name) { 81

//taken别忘了 82

if(markarr[j].argu==1) { 83

p = strtok(NULL, delim); 84

if(p==NULL) { //jmup to 下一行 ,异常处理就是设bomb, 85

bomb=1; 86

break; 87

} else { 88

strcpy(markarr[j].argustr,p); 89

markarr[j].taken=1; 90

hash[markarr[j].name-'a']=j; 91

break; 92

} 93

} else { 94

markarr[j].taken=1; 95

hash[markarr[j].name-'a']=j; 96

break; 97

} 98

} else { 99

bomb2++;100

continue;101

}102

}103

if(bomb2==id) {104

bomb=1;105

break;106

}107

} else {108

//其他的选项的话(第一个出现bomb,第二个出现的情况也不可能,也是bomb)109

bomb=1;110

break;111

}112 113

}114

//output,首先排序?hash115

for(int k=0; k<26; k++) {116

if(hash[k]!=-1) {117

markarr[hash[k]].print();118

}119

}120

printf("\n");121

}122 123

return 0;124 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值