为什么sscanf在C语言中的取值超过了期望值?

问题描述 投票:0回答:1

为什么sscanf比期望值更多?

示例代码。

int main()
{
    char *str="a:b:c:d:g:s:d";
    int a[4]={0};
    int ret;
    ret = sscanf(str,"%x:%x:%x:%x",&a[0],&a[1],&a[2],&a[3]); /*It prints 4 but in input I have given 7 values(a,b,c,d,g,s,d)*/
    if(ret==4)
    {
        printf("success\n");// it prints success anyways!
    }
    return 0
}

我想只有当*str包含4个八位数(a:b:c:d - 只有十六进制值)时才进入if条件。

注意:如果我给的值少于4个八位数,就不会进入if条件。

c scanf
1个回答
1
投票

你的字符串没有给出七个值,因为 "g "和 "s "不是有效的十六进制值。所以先解决这个问题。

char *str="a:b:c:d:e:f:1";

然后尝试读取4个以上的值

ret = sscanf(str,"%x:%x:%x:%x:%x",&a[0],&a[1],&a[2],&a[3],&ret);

现在,如果有四个以上的值,这段代码就会读取其中的五个,然后就会有一个 "g "和 "s"。if 会失败。我重用了 ret 因为返回值的赋值保证会在之后发生。但如果这让你害怕或困惑,你可以这样做。

int dummy;
ret = sscanf(str,"%x:%x:%x:%x:%x",&a[0],&a[1],&a[2],&a[3],&dummy);
© www.soinside.com 2019 - 2024. All rights reserved.