初始化sscanf返回的无符号整数

初始化sscanf返回的无符号整数,c,scanf,C,Scanf,变量(a、r、g、b)将包含先前计算留下的任意值 unsigned int parse_colour( const char *str ) { unsigned int a, r, g, b; int ret; if( !str || !*str ) return 0; if( strlen( str ) == 1 ) return (unsigned int)atoi( str ); if( str[0] == '0' && str

变量(a、r、g、b)将包含先前计算留下的任意值

unsigned int parse_colour( const char *str )
{
    unsigned int a, r, g, b;
    int ret;

    if( !str || !*str ) return 0;

    if( strlen( str ) == 1 ) return (unsigned int)atoi( str );

    if( str[0] == '0' && str[1] == 'x' ) {
            ret = sscanf( str, "0x%x", &a );
    } else {
            ret = sscanf( str, "%u %u %u %u", &a, &r, &g, &b );
    }

    if( ret == 1 ) {
            return a;
    } else if( ret == 2 ) {
            return 0xff000000 | ( (a & 0xff) << 8 ) | (r & 0xff);
    } else if( ret == 3 ) {
            return 0xff000000 | ( (a & 0xff) << 16 ) | ( (r & 0xff) << 8 ) | ( g & 0xff);
    } else if( ret == 4 ) {
            return ( (a & 0xff) << 24 ) | ( (r & 0xff) << 16 ) | ( ( g & 0xff) << 8 ) | (b & 0xff);
    }

    return 0;
}
unsigned int parse_color(const char*str)
{
无符号整数a,r,g,b;
int ret;
如果(!str | |!*str)返回0;
if(strlen(str)==1)返回(unsigned int)atoi(str);
如果(str[0]='0'&&str[1]='x'){
ret=sscanf(str,“0x%x”、&a);
}否则{
ret=sscanf(str,“%u%u%u%u”、&a、&r、&g、&b);
}
如果(ret==1){
返回a;
}else if(ret==2){

返回0xff000000|((a&0xff)您收到此警告的原因是
sscanf
可能会失败(至少编译器认为是这样),在这种情况下,
a
在几行之后返回基于它的值时将保持未初始化状态。

如果收到警告,编译器可能会看到两条路径

ret = sscanf( str, "0x%x", &a );
ret = sscanf( str, "%u %u %u %u", &a, &r, &g, &b );
第一条路径未初始化
rgb

稍后,代码使用
rgb
,并且不“知道”sscanf()
s和您的
if()
s如何组合以防止意外使用未初始化的变量

按照@Juraj Blaho的建议,将
a、r、g、b
初始化为0不会降低性能。您正在调用
sscanf()
,这会占用大量CPU。
这是一个“误报”,但我建议更改代码以防止出现任何警告


小点子:


移植问题:由于a
unsigned int
只能确定为至少2个字节,
(a&0xff)您的问题是什么?a、r、g、b在用于任何事情之前都使用sscanf语句进行设置只有零初始化且安全。