当输入多于所需时,sscanf 检查不起作用

sscanf check doesn't work when given more input than required

我有一个 if 语句,它应该检查用户是否输入 完全 4 个参数,由 var 分隔,如下所示:param1、param2、param3、param4 .问题是如果用户提供超过 4 个输入,它不会 return 出错。只有当他给出的小于 4 时才会 return 出错。

char input[60];
char a1[42], a2[42], a3[42], a4[1];
printf("Enter info");
fgets(input, 60, stdin);
if (4 != sscanf(input,"%1[^,\n], %1[^,\n], %1[^,\n], %[^,\n]",a1, a2, a3, a4)) {
    return printf("Error"),1;
}
else
{
    printf("In");
}

我似乎找不到原因。感谢您的帮助

有关 sscanf 的更多信息,请阅读此内容:sscanf info。问题是这个

On success, the function returns the number of variables filled. In the case of an input failure before any data could be successfully read, EOF is returned.

你的 sscanf 不会 return 超过四个,因为函数只有 return 变量的数量 FILLED。

如果sscanf读取数据成功则return填充变量的个数。如果你想要填充少于 4 个变量,你应该说:

被认为是成功的
if (sscanf(input,"%1[^,\n], %1[^,\n], %1[^,\n], %[^,\n]",a1, a2, a3, a4)<=4) {
        printf("In");
}

此外,在失败时 sscanf 将 return EOF,但不会 return 大于 4 的数字。

(请注意,对于 a4[1],您没有 space 作为终结符。至少使用 a4[2]。)

并且由于您希望填充超过 4 个变量被视为失败,因此您可以向 sscanf 添加一个变量(如果已填充),这意味着输入了超过 4 个,这是错误的,您将打印错误

编辑:如果你确实想要4变量,使用下面的代码:

    char input[60];
    char a1[42], a2[42], a3[42], a4[2],a5[42];
    printf("Enter info");
    fgets(input, 60, stdin);
    if (sscanf(input, "%1[^,\n], %1[^,\n], %1[^,\n], %1[^,\n], %[^,\n]", a1, a2, a3, a4,a5) == 4) {
        printf("In");
    }
    else
    {
        printf("error");
        exit(EXIT_FAILURE);
    }
}

现在如果你给 a,b,c,d,e 你会打印错误,因为现在已经填充了 4 个以上的变量。

函数 sscanf 尝试从输入缓冲区(在本例中是一个字符串)中读取您在格式字符串中指定的项目数和 returns 读取项目数。

您应该检查缓冲区的 "tail" 是否不包含除空格以外的任何符号。

这是一个演示程序。

#include <stdio.h>
#include <string.h>

int main(void) 
{
    const char *input = "I , am , learning , the , programming , language , C\n";

    char a1[42], a2[42], a3[42], a4[42];

    int tail = 0;

    int result = sscanf( input, "%[^,\n] , %[^,\n] , %[^,\n] , %[^,\n]%n",
                         a1, a2, a3, a4, &tail );

    if ( result == 4 && input[strspn( input + tail, " \t\n" ) + tail] == '[=10=]' )
    {
        printf( "%s %s %s %s\n", a1, a2, a3, a4 );
    }
    else
    {
        puts( "I am sorry but you do not yet know C." );
    }

    input = "I , am , learning , C \n";

    result = sscanf( input, "%[^,\n] , %[^,\n] , %[^,\n] , %[^,\n]%n",
                         a1, a2, a3, a4, &tail );

    if ( result == 4 && input[strspn( input + tail, " \t\n" ) + tail] == '[=10=]' )
    {
        printf( "%s %s %s %s\n", a1, a2, a3, a4 );
    }
    else
    {
        puts( "I am sorry but you do not yet know C." );
    }

    return 0;
}

它的输出是

I am sorry but you do not yet know C.
I  am  learning  C