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