代码之家  ›  专栏  ›  技术社区  ›  Jacob Nelson

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

c
  •  1
  • Jacob Nelson  · 技术社区  · 14 年前

    所以问题是,用户可以输入一个int,也可以输入三个int,这都取决于第一个输入。有点混乱,所以这里有一个例子:

    printf("Please enter input in this format: (-blackwhite | -color) colorvalue");
    

    用户输入“-blackwhite 40”所以我想

    scanf("%s %u", charArray, &int);
    

    但用户也可以输入“-color 254 254”然后我会想

    scanf("%s %u %u %u", charArray, &int1, &int2, &int3);
    

    我该怎么做呢?基本上在我扫描变量之前先验证数据。

    4 回复  |  直到 14 年前
        1
  •  6
  •   paxdiablo    14 年前

    从未 %s 在里面 scanf 除非完全控制输入数据格式(这里没有)。

    否则,您将打开代码以导致缓冲区溢出。

    你应该做的是 fgets 一行来自 stdin (因为这提供了缓冲区溢出保护)然后 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;
    }
    
        2
  •  1
  •   Alexander Rafferty    14 年前

    也许你应该先扫描单词,测试它,然后适当地扫描数字。

        3
  •  1
  •   Jonathan Leffler    14 年前

    -blackwhite 读一首单曲 int 如果匹配;否则将字符串与 -color 读三遍

    if (scanf("%40s", charArray) == 1)
    {
        if (strcmp(charArray, "-blackwhite") == 0)
        {
            if (scanf("%d", &int1) == 1)
                ...OK...
            else
                ...error...
        }
        else if (strcmp(charArray, "-color") == 0)
        {
            if (scanf("%d %d %d", &int1, &int2, &int3) == 3)
                ...OK...
            else
                ...error...
        }
        else
            ...error...
    
        4
  •  0
  •   YeenFei    14 年前

    如果您的参数总是以“string input”开头,然后后跟nx“integer input”,那么您可以使用最大可能的整数输入数编写代码,如下所示: scanf