检查输入是什么样的,然后使用scanf(C)

Jac*_*son 1 c

所以问题是用户可以给出一个int的输入,或者用户可以给三个int的输入.这一切都取决于第一个输入.这里有点令人困惑的例子:

printf("Please enter input in this format: (-blackwhite | -color) colorvalue");
Run Code Online (Sandbox Code Playgroud)

用户输入"-blackwhite 40"所以我想

scanf("%s %u", charArray, &int);
Run Code Online (Sandbox Code Playgroud)

但是用户也可以输入"-color 254 254 254"然后我想要

scanf("%s %u %u %u", charArray, &int1, &int2, &int3);
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?在将数据扫描到变量之前,基本上验证数据.

pax*_*blo 6

除非你完全控制输入数据格式(你不在这里)%s,scanf否则永远不要使用裸(无界).

否则,您打开代码来缓冲溢出.

你应该做的是fgetsstdin(因为这提供缓冲区溢出保护)然后简单sscanf的线路.

这有额外的好处,你可以使用sscanf更长的四参数格式字符串,如果失败,尝试使用双参数字符串.

像这样的东西:

#include <stdio.h>

int main (void) {
    char buffer[200];
    int i1, i2, i3, count;

    printf("Please enter input in format: (-blackwhite | -color) colorvalue: ");
    fflush (stdout);
    if (fgets (buffer, sizeof (buffer), stdin) != NULL) {
        if ((count = sscanf (buffer, " -color %d %d %d", &i1, &i2, &i3)) != 3)
            count = sscanf (buffer, " -blackwhite %d", &i1);
        switch (count) {
            case  1: printf ("blackwhite %d\n", i1);          break;
            case  3: printf ("color %d %d %d\n", i1, i2, i3); break;
            default: printf ("Huh?: %s\n", buffer);           break;
        }
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)