所以我有一个程序,我需要使用scanf函数从用户那里获取初始命令,问题是它可能只是一个字符串命令,一个字符串命令和一个字符串参数,一个字符串命令和一个int参数或一个字符串命令和两个int参数
所以我需要以某种方式创建一个能够处理所有这些的scanf函数,因为我不知道哪个将首先被选中
所以我处理所有边缘情况的代码是
scanf("%s", c);
scanf("%s%s", c, s;
scanf("%s%d", c, &i);
scanf("%s%d%d", c, &i, &i2);
以及可由最终用户输入的可能命令的示例
print
insert Hello
del 4
pick 2 5
但这不起作用
那么有没有办法让scanf函数有条件地执行?
答案 0 :(得分:3)
读取整行,最好使用类似fgets的安全函数,然后解析生成的字符串以确定用户是否编写了有效命令。然后可以使用if
语句实现条件执行。
答案 1 :(得分:2)
您只能阅读第一个单词,然后确定下一步需要阅读的内容:
char command[32];
scanf("%s", command);
if(strncmp(command, "print", 32) == 0) {
...
}
else if(strncmp(command, "insert", 32) == 0) {
char string[32];
scanf("%s", string);
...
}
else if(strncmp(command, "del", 32) == 0) {
int i;
scanf("%d", &i);
...
}
else if(strncmp(command, "pick", 32) == 0) {
int i, j;
scanf("%d %d", &i, &j);
...
}
答案 2 :(得分:2)
因为scanf系列函数返回成功解析字段的数量,使用gets获取完整字符串,然后使用sscanf放置更长的模式:
char buffer[,..], cmd[...];
int num1, num2;
gets(buffer);
if (sscanf(buffer, "%[^ ] %d %d", cmd, &num1, &num2) == 3) {
...
}
else if (sscanf(buffer, "%[^ ] %d", cmd, &num1) == 2) {
...
} else {
...
}
模式%[^ ]
获取排除第一个空白的字符串。
另外,按空格分隔模式,scanf跳过之间的任何空格
答案 3 :(得分:1)
读取整行,然后使用sscanf
解析它。
下面是一些不好的代码:
scanf("%s", buf);
if (strcmp(buf, "print") == 0) {
call_print();
} else if (strncmp(buf, "insert ", 7) == 0) {
call_insert(buf + 7); // pointer magic!
} else if (strncmp(buf, "del ", 4) == 0) {
int i;
sscanf(buf + 4, "%d", &i); // feel free to use atoi or something
call_del(i);
} else if (strncmp(buf, "pick ", 5) == 0) {
int i, i2;
sscanf(buf + 5, "%d%d", &i, &i2);
call_pick(i, i2);
} else {
printf("Does not compute!\n");
}