2013-10-10 64 views
1

所以我有一个程序,我需要从用户使用scanf函数的初始命令,问题是它可能只是一个字符串命令,一个字符串命令和一个字符串参数,一个字符串命令和一个int参数或一个字符串命令和两个int参数有条件地执行scanf函数?

,所以我需要以某种方式创建一个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函数?

回答

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); 
    ... 
} 
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"); 
} 
3

阅读整条生产线,最好是具有安全功能像fgets,然后解析结果字符串以确定用户是否写入了有效的命令。然后可以使用if语句来实现条件执行。

2

因为函数scanf系列返回成功解析的字段的数量,用得到,然后利用获取完整的字符串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跳过任意之间的空格...