Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查输入是什么样的,然后使用scanf(C)_C - Fatal编程技术网

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

检查输入是什么样的,然后使用scanf(C),c,C,所以问题是用户可以给出一个整数的输入,或者用户可以给出一个三个整数的输入,这都取决于第一个输入。有点让人困惑,下面是一个例子: printf("Please enter input in this format: (-blackwhite | -color) colorvalue"); 用户输入“-blackwhite 40”所以我想 scanf("%s %u", charArray, &int); 但用户也可以输入“-color254 254 254”,然后我会想 scanf("%

所以问题是用户可以给出一个整数的输入,或者用户可以给出一个三个整数的输入,这都取决于第一个输入。有点让人困惑,下面是一个例子:

printf("Please enter input in this format: (-blackwhite | -color) colorvalue");
用户输入“-blackwhite 40”所以我想

scanf("%s %u", charArray, &int);
但用户也可以输入“-color254 254 254”,然后我会想

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

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

读取字符串;将字符串与
-blackwhite
进行比较,如果匹配,则读取单个
int
;否则,将字符串与
-color
进行比较,如果匹配,则读取三个
int
s;否则就对用户发牢骚

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...

读字符串;将字符串与
-blackwhite
进行比较,如果匹配,则读取单个
int
;否则,将字符串与
-color
进行比较,如果匹配,则读取三个
int
s;否则就对用户发牢骚

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...

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

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

除非你完全控制输入数据格式(这里没有),否则千万不要在
scanf
中使用裸(无界)
%s

否则,您将打开代码以防止缓冲区溢出

您应该做的是将
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;
}
#包括
内部主(空){
字符缓冲区[200];
inti1,i2,i3,计数;
printf(“请输入格式:(-blackwhite |-color)colorvalue:);
fflush(stdout);
如果(fgets(buffer,sizeof(buffer,stdin)!=NULL){
如果((计数=sscanf(缓冲区,“-颜色%d%d”、&i1、&i2和&i3))!=3)
计数=sscanf(缓冲区,“-blackwhite%d”,&i1);
开关(计数){
案例1:printf(“黑白%d\n”,i1);中断;
案例3:printf(“颜色%d%d%d\n”,i1、i2、i3);中断;
默认值:printf(“Huh?:%s\n”,缓冲区);中断;
}
}
返回0;
}
除非您完全控制输入数据格式(此处没有),否则切勿在
scanf
中使用裸(无界)
%s

否则,您将打开代码以防止缓冲区溢出

您应该做的是将
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;
}
#包括
内部主(空){
字符缓冲区[200];
inti1,i2,i3,计数;
printf(“请输入格式:(-blackwhite |-color)colorvalue:);
fflush(stdout);
如果(fgets(buffer,sizeof(buffer,stdin)!=NULL){
如果((计数=sscanf(缓冲区,“-颜色%d%d”、&i1、&i2和&i3))!=3)
计数=sscanf(缓冲区,“-blackwhite%d”,&i1);
开关(计数){
案例1:printf(“黑白%d\n”,i1);中断;
案例3:printf(“颜色%d%d%d\n”,i1、i2、i3);中断;
默认值:printf(“Huh?:%s\n”,缓冲区);中断;
}
}
返回0;
}

如果您的参数总是以“字符串输入”开头,然后是nx“整数输入”,您可以使用最大可能的整数输入数编写代码,因为
scanf
将返回您填充的参数数。

如果您的参数总是以“字符串输入”开头,然后是nx“整数输入”,您可以使用尽可能多的整数输入来编写代码,因为
scanf
将返回您所填充的参数数。

永远不要使用scanf:-)甚至不要想它。甚至可能不必尝试双参数版本。由于这两种形式的参数顺序相同,他可能只依赖于返回值4或2。就我个人而言,我会先做更多的验证,避免所有的
scanf()
变体。事实上,虽然它在坏人手中很危险,但它可以安全使用。但决不要使用无界的
%s
。通常最好是完全远离它,除非你非常清楚它的缺点。永远不要使用scanf:-)甚至不要想它。甚至可能不必尝试两个参数的版本。由于这两种形式的参数顺序相同,他可能只依赖于返回值4或2。就我个人而言,我会先做更多的验证,避免所有的
scanf()
变体。事实上,虽然它在坏人手中很危险,但它可以安全使用。但决不要使用无界的
%s
。通常最好是完全远离它,除非你非常清楚它的缺点。