有条件地执行scanf功能吗?

时间:2013-10-10 15:41:50

标签: c

所以我有一个程序,我需要使用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 个答案:

答案 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");
}