2

所以我有一个程序,我需要使用 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函数?

4

4 回答 4

3

您可以只阅读第一个单词,然后确定接下来需要阅读的内容:

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);
    ...
}
于 2013-10-10T15:48:07.467 回答
3

阅读整行,最好使用 fgets 之类的安全函数,然后解析结果字符串以确定用户是否编写了有效命令。然后可以使用该if语句实现条件执行。

于 2013-10-10T15:49:31.580 回答
2

由于 scanf 系列函数返回成功解析的字段数,因此使用 get 获取完整字符串,然后使用 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 跳过...之间的任何空格

于 2013-10-10T15:53:38.887 回答
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");
}
于 2013-10-10T15:47:51.617 回答