题解 | #配置文件恢复#

配置文件恢复

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

全部评论
其实比对也可以更简单一些,直接使用strncmp即可,不需要复制之后再进行比对
点赞 回复 分享
发布于 2023-01-02 21:09 上海

相关推荐

11-22 16:49
已编辑
北京邮电大学 Java
美团 质效,测开 n*15.5
点赞 评论 收藏
分享
10-21 23:48
蚌埠坦克学院
csgq:可能没hc了 昨天一面完秒挂
点赞 评论 收藏
分享
10-25 02:13
门头沟学院 C++
_凡_:8.27笔试10.22评估
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务