题解 | 配置文件恢复 纯c暴力匹配
配置文件恢复
https://www.nowcoder.com/practice/ca6ac6ef9538419abf6f883f7d6f6ee5
#include <stdio.h> #include<string.h> char ml[6][2][10]={"reset","\0","reset","board","board","add","board","delete","reboot","backplane","backplane","abort"};//命令1~6、命令单词1~2、单词内容 char out[6][20]={"reset what","board fault","where to add","no board at all","impossible","install first"}; int main() { char in[20]={}; while(gets(in)){ int len=strlen(in); char str[2][10]={}; int idx=-1;//标记空格位置,默认无空格 for(int i=0;i<len;i++){ if(in[i]==' '){ idx=i; } } if(idx>10||(len-idx-1)>9){//有字符串大于9个字母时匹配失败 printf("unknown command\n"); continue; } int pp[6]={0};//匹配结果唯一标记 if(idx==-1){//无空格,只匹配第一个单词 strcpy(str[0],in); for(int i=0;i<len;i++){ if(str[0][i]!=ml[0][0][i]){ printf("unknown command\n"); } else if(i==len-1){ printf("%s\n",out[0]); } } } else{//有空格,从第二个命令开始匹配 strcpy(str[1],in+idx+1); in[idx]='\0'; strcpy(str[0], in);//此时第一个字符串的长度恰好为空格的下标idx for(int i=1;i<6;i++){ for(int j=0;j<idx;j++){ if(str[0][j]!=ml[i][0][j]){ goto next;// } } for (int j=0; j<len-idx-1; j++) { if(str[1][j]!=ml[i][1][j]){ goto next;//进入下一个命令匹配 } } pp[i]=1;//都未退出循环时确认匹配成功,标记1; continue; next: pp[i]=0;//匹配失败跳出循环时,对应命令标记0 } int ppn=0;//匹配到几个命令 int ppi=-1;//最后一个匹配的是哪个命令(实际只有ppn=1时才有意义) for(int i=0;i<6;i++){ ppn+=pp[i]; if(pp[i]==1)ppi=i; } if(ppn==1){ printf("%s\n",out[ppi]); } else { printf("unknown command\n"); } } } return 0; }