题解 | #配置文件恢复#
配置文件恢复
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.本题的字典构建和题解在于已经知晓原字典命令的基础上形成的,如果需要拓展双指令命令,那么只需要修改字典和遍历范围即可,但是如果存在更多段的指令命令,则需要多加循环,拓展性和通用性不够,可以再完善(使用递归,只有前面的匹配了再检查后面的段)。
查看23道真题和解析