ccf201403-3命令行选项语法错误那道题,样例和我自己改的测试值都对,为什么只得了0分,求帮助!事成必有重谢

首先请允许我吐个槽。。。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 &stdio.h&
2 #include &string.h&
3 #define LOCAL
4 struct mark {
char argustr[256];
void print() {
if(taken==1) {
printf("-%c ",name);
if(argu==1) {
printf("%s ",argustr);
17 };//输入之后按照name排序
18 int hash[30];
19 char markstr[54];
20 mark markarr[30];
22 char *delim = " ";
24 int main() {
25 #ifdef LOCAL
freopen("data.in","r",stdin);
scanf("%s",markstr);
for(int i=0; i&30; i++) {
markarr[i].name='\0';
markarr[i].argu=0;
markarr[i].taken=0;
memset(markarr[i].argustr,'\0',sizeof(markarr[i].argustr));
for(int i=0; i&strlen(markstr); i++) {
markarr[id].name=markstr[i];
if(i!=strlen(markstr)-1) {
if(markstr[i+1]==':') {
markarr[id].argu=1;
scanf("%d",&n);
char input[260];
for(int i=0; i&n; i++) {
for(int i=0; i&30; i++) {
markarr[i].name='\0';
markarr[i].argu=0;
markarr[i].taken=0;
memset(markarr[i].argustr,'\0',sizeof(markarr[i].argustr));
for(int i=0; i&strlen(markstr); i++) {
markarr[id].name=markstr[i];
if(i!=strlen(markstr)-1) {
if(markstr[i+1]==':') {
markarr[id].argu=1;
printf("Case %d: ",i+1);
memset(hash,-1,sizeof(hash));
scanf("%c",&rb);
scanf("%[^\n]",&input);
p=strtok(input, delim);
int bomb=0;
while((p = strtok(NULL, delim))) {
if(bomb==1) break;
//这里对其进行解析,遍历所有的看是否有匹配,如果有多进行一轮strtok
if(p[0]=='-'&&strlen(p)==2) {
int bomb2=0;
for(int j=0; j& j++) {
if(p[1]==markarr[j].name) {
//taken别忘了
if(markarr[j].argu==1) {
p = strtok(NULL, delim);
if(p==NULL) { //jmup to 下一行 ,异常处理就是设bomb,
strcpy(markarr[j].argustr,p);
markarr[j].taken=1;
hash[markarr[j].name-'a']=j;
markarr[j].taken=1;
hash[markarr[j].name-'a']=j;
if(bomb2==id) {
//其他的选项的话(第一个出现bomb,第二个出现的情况也不可能,也是bomb)
//output,首先排序?hash
for(int k=0; k&26; k++) {
if(hash[k]!=-1) {
markarr[hash[k]].print();
printf("\n");
阅读(...) 评论()  请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。
  选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如&-a& 或&-b&。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。
  该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, &ab:m:& 表示该程序接受三种选项,即&-a&(不带参数),&-b&(带参数), 以及&-m&(带参数)。
  命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。
输入格式
  输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。
  输入的第二行是一个正整数 N(1 ≤ N ≤ 20),表示你需要处理的命令行的个数。
  接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。
输出格式
  输出有 N 行。其中第 i 行以&Case i:& 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。
ls -a -l -a documents -b
ls -w 10 -x -w 15
ls -a -b -c -d -e -l
Case 1: -a -l
Case 3: -w 15 -x
Case 4: -a -b
此题只能得90分,希望各路大神看出问题的话不吝赐教
& 首先肯定是用26位数组,我这里没有判断一个有参选项的参数是否合法,因为我觉得输入肯定是保证其
合法的,用代码验证后发现也确实如此(加上这类 验证仍然为90分)。以下是代码
import java.util.S
class Arg {
boolean hasP
boolean isA
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Arg[] argues = new Arg[26];
for (int i = 0; i & argues. i++) {
argues[i] = new Arg();
char[] rule = input.nextLine().toCharArray();
for (int i = 0; i & rule. i++) {
if (rule[i] == ':')
argues[rule[i - 1] - 'a'].hasPar =
argues[rule[i] - 'a'].isAppear =
int n = Integer.parseInt(input.nextLine());
StringBuilder[] result = new StringBuilder[n];
for (int i = 0; i & i++) {
result[i] = new StringBuilder(&Case & + (i + 1) + &: &);
boolean[] isAppear = new boolean[26];
String[] parameter = new String[26];
String[] in = input.nextLine().split(& &);
for (int j = 1; j & in.) {
if (((in[j].length() != 2 || in[j].charAt(0) != '-')
|| (in[j].charAt(1) - 'a' & 0 || in[j].charAt(1) - 'a' & 25))
|| (!argues[in[j].charAt(1) - 'a'].isAppear)) {
char c = in[j].charAt(1);
if (argues[c - 'a'].hasPar) {
isAppear[c - 'a'] =
parameter[c - 'a'] = in[j + 1];
isAppear[c - 'a'] =
for (int j = 0; j & 26; j++) {
if (isAppear[j]) {
char temp = (char) ('a' + j);
result[i].append(&-& + temp + & &);
if (argues[j].hasPar)
result[i].append(parameter[j] + & &);
input.close();
for (int i = 0; i & i++) {
System.out.println(result[i].toString().trim());
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:201次
排名:千里之外

我要回帖

更多关于 命令行选项不兼容 的文章

 

随机推荐