3

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

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

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

4

3 回答 3

3

如果sscanf成功读取数据,它将返回填充变量的数量。如果您希望填充的变量少于4,被认为是成功的,您应该说:

if (sscanf(input,"%1[^,\n], %1[^,\n], %1[^,\n], %[^,\n]",a1, a2, a3, a4)<=4) {
        printf("In");
}

此外, in failuresscanf将返回EOF,但它不会返回大于 的数字4

(请注意,a4[1]您没有空间用于终止符。至少使用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 个以上的变量。

于 2020-04-06T18:57:42.580 回答
1

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

成功时,该函数返回填充的变量数。如果在成功读取任何数据之前输入失败,则返回 EOF。

您的 sscanf 不会返回超过四个,因为该函数仅返回FILLED 变量的数量。

于 2020-04-06T18:44:58.363 回答
1

该函数sscanf尝试从输入缓冲区(在本例中为字符串)读取与您在格式字符串中指定的一样多的项目,并返回已读取项目的数量。

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

这是一个演示程序。

#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] == '\0' )
    {
        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] == '\0' )
    {
        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 
于 2020-04-06T19:05:41.443 回答