比较容易想到的办法:取输入字符串第一行和第二行分别与命令串比较,判断是不是其前缀子串。再统计匹配成功次数,成功两次且唯一就输出。
也是因为对C库函数不太了解的原因,老老实实做的,代码写得太多了,最开始的命令串声明改成二维数组存储,代码量会少很多。
/*只能判断串中间最多只有一个空格的字符串*/
#include <stdio.h>
#include <string.h>
char s1[]="reset";
char s2[]="reset board";
char s3[]="board add";
char s4[]="board delete";
char s5[]="reboot backplane";
char s6[]="backplane abort";
int check(char*a,char* b,int n,int step){//判断两个字符串其中n位是否相等
if(step==1){//只有一个串的情况
int flag=0;
for(int i=0;i<n;i++){
if(a[i]!=b[i]){
flag=1;
break;
}
}
if(!flag){
return 1;
}
return 0;
}
else{//判断第二个串
int j;
if(*&a==&s2 || *&a==&s3 || *&a==&s4){
j=6;
}
else if(*&a==&s5){
j=7;
}
else{
j=10;
}
int flag=0;
for(int i=0;i<n;i++){
if(a[i+j]!=b[i]){
flag=1;
break;
}
}
if(!flag){
return 1;
}
return 0;
}
}
int main(){
char cmd[20];
while(fgets(cmd,20,stdin)!=NULL){
int len=strlen(cmd)-1,i;
char t[20]={0};
int tab[7]={0};//建立匹配检查表
int flag=0;//表示是否有两字符串
for(i=0;i<len;i++){//截取输入字符串cmd[]空格前的字符存入t[]
if(cmd[i]!=' '){
t[i]=cmd[i];
}
else{
flag=1;
break;
}
}
if(!flag){//只有一个字符串,对比是否是s1的字串
int x=check(s1,t,len,1);
if(x){
printf("reset what");
}
else{
printf("unknown command");
}
}
else{//有两个字符串时,检查匹配情况
tab[2]=check(s2,t,i,1);
tab[3]=check(s3,t,i,1);
tab[4]=check(s4,t,i,1);
tab[5]=check(s5,t,i,1);
tab[6]=check(s6,t,i,1);
for(int k=2;k<7;k++){//检查第一个串是否相匹配
int flag1=0;
if(tab[k]){
flag=1;
break;
}
}
if(!flag){
printf("unknown command");
}
else{
for(int k=i+1;k<len;k++){//截取输入字符串cmd[]空格后的字符存入t[]
t[k-i-1]=cmd[k];
}
i=len-i-1;
if(check(s2,t,i,2)){
tab[2]++;
}
if(check(s3,t,i,2)){
tab[3]++;
}
if(check(s4,t,i,2)){
tab[4]++;
}
if(check(s5,t,i,2)){
tab[5]++;
}
if(check(s6,t,i,2)){
tab[6]++;
}
int temp,flag1=0;
for(int k=2;k<7;k++){//检查第二个串是否相匹配
if(tab[k]==2){
if(++flag1==2){
printf("unknown command");
break;
}
temp=k;
}
}
if(flag1==1){
switch(temp){
case 2:printf("board fault");break;
case 3:printf("where to add");break;
case 4:printf("no board at all");break;
case 5:printf("impossible");break;
case 6:printf("install first");break;
}
}
else if(!flag1){
printf("unknown command");
}
}
}
printf("\n");
}
}

京公网安备 11010502036488号