题解 | #配置文件恢复#
配置文件恢复
https://www.nowcoder.com/practice/ca6ac6ef9538419abf6f883f7d6f6ee5
#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { //思路,构建字符串字典表,然后根据匹配规则进行处理 //设定一个flag变量,每匹配一个则记录对应下标并记录有多少匹配的 //当且仅当有匹配且匹配数为1的时候输出对应的结果,否则输出出错信息 const char com[6][18]={"reset","reset board","board add", "board delete","reboot backplane", "backplane abort"}; const char res[6][18]={"reset what","board fault", "where to add","no board at all", "impossible","install first"}; const char err[18]={"unknown command"}; const int space[6]={0,6,6,6,7,10};//用来指明双指令命令的后单词位置 //构建字典表,用来进行匹配的判断 int count=0; int loc=-1; char first[10]; char c; char second[10]; while(~scanf("%s%c",first,&c)){ //getchar(); //读取用户输入的一行信息,如果是双字符命令,那么按照双字符 //的方式进行处理,否则按照单字符匹配方式进行处理 if(c==' '){ //second[0]=c; scanf("%s",second); //双字符命令,后5个匹配 for(int i=1;i<6;i++){ char tmp1[10]; char tmp2[10]; int tc1=strlen(first); int tc2=strlen(second); strncpy(tmp1, com[i], tc1); tmp1[tc1]='\0'; strncpy(tmp2, com[i]+space[i], tc2); tmp2[tc2]='\0'; if(strcmp(tmp1,first)==0&&strcmp(tmp2,second)==0){ loc=i; count++; } } } else{ //单字符命令,仅第一个匹配 char tmp1[10]; int tc1=strlen(first); strncpy(tmp1, com[0], tc1); tmp1[tc1]='\0'; if(strcmp(tmp1,first)==0){ loc=0; count++; } } if(count==1) printf("%s\n",res[loc]); else printf("%s\n",err); count=0;loc=-1; } return 0; }
思路如上注释,记录几个细节。
1.循环的结束,在这里最开始没有写while循环中scanf前面的~,导致程序死循环,因为没有退出条件;
2.strncpy相比于strcpy的优势在于可以指定复制多少位的数据;
3.本题的字典构建和题解在于已经知晓原字典命令的基础上形成的,如果需要拓展双指令命令,那么只需要修改字典和遍历范围即可,但是如果存在更多段的指令命令,则需要多加循环,拓展性和通用性不够,可以再完善(使用递归,只有前面的匹配了再检查后面的段)。