题解 | #配置文件恢复#
配置文件恢复
https://www.nowcoder.com/practice/ca6ac6ef9538419abf6f883f7d6f6ee5
//多种确定命令采用固定数组存储(对于空格采用两个数组分开判断),用cmd_out函数表达对应输出内容(利用数组下标做switch),通过对字符串长度>16初筛;判断是否有空格及空格位置,作为字符串比较的分隔方式,strncmp对字符串进行比对,存储下标进行输出。int strncmp(const char *str1, const char *str2, size_t num):两个比较字符串的指针,一个无符号数代表比较的字符个数,返回类型为一个大于零小于零或等于零的整型。 #include <stdio.h> #include <string.h> char *cmd1[6]={"reset","reset","board","board","reboot","backplane"}; char *cmd2[6] = {"no use","board","add","delete","backplane","abort"}; void cmd_out(int index) //各命令对应输出 { switch(index) { case 0: printf("reset what\n"); break; case 1: printf("board fault\n"); break; case 2: printf("where to add\n"); break; case 3: printf("no board at all\n"); break; case 4: printf("impossible\n"); break; case 5: printf("install first\n"); break; default: printf("unknown command\n"); break; } } int main() { char in[28] = {'\0'}; while( gets(in) ) //输入字符串 { int len = strlen(in); if(len>16) { printf("unknown command\n"); //命令最长为16个字符,超过则为错误,退出当前if判断及之后,执行下一次while循环 continue; } int blank_flag = 1, pos; for(int i=0; i<len; i++) //blank_flag判断是否有空格,pos为空格的位置 { if(in[i] == ' ') { blank_flag = 0; pos = i; break; } } //输入一个字符串的情况,即空格标志为1(无空格) if(blank_flag) { if(strncmp(in, cmd1[0], len) == 0) //判断字符串与命令字符串的内容是否相等 { printf("reset what\n"); //一个字符串的命令只有reset } else { printf("unknown command\n"); } } //输入两个字符串的情况 else { int cnt = 0, index; for(int i=1; i<6; i++) //两个字符串的从第二个开始 { if(strncmp(in, cmd1[i], pos) == 0 && strncmp(in+pos+1, cmd2[i],len-pos-1) == 0) { cnt++;//=1表示仅一次相等,有效,超过则无效 index = i;//存储当前命令字位置 } } if(cnt==1) cmd_out(index); else printf("unknown command\n"); } } return 0; }