题解 | 配置文件恢复 纯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;
}

全部评论

相关推荐

asdasdasdasdas:19岁,不容易啊可能升个本会好点,现在学历歧视太严重了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务