C(linux上的gcc):如何转换十六进制字符串;0xfffffff";一个整数?

C(linux上的gcc):如何转换十六进制字符串;0xfffffff";一个整数?,c,gcc,C,Gcc,C(linux上的gcc):如何将十六进制字符串“0xfffffff”转换为整数?另一种准可移植的方式是strtol,它是strtoul,strtoll和strtoull。它们看起来像: scanf("%x", &integer); sscanf("0xffffffff", "%x", &integer); long strtol(const char * restrict nptr, char ** restrict endptr, int base); 使用有点奇怪。

C(linux上的gcc):如何将十六进制字符串“0xfffffff”转换为整数?

另一种准可移植的方式是
strtol
,它是
strtoul
strtoll
strtoull
。它们看起来像:

 scanf("%x", &integer);
 sscanf("0xffffffff", "%x", &integer);
long
strtol(const char * restrict nptr, char ** restrict endptr, int base);
使用有点奇怪。第一个参数是要转换的字符串,第三个参数是基数,十六进制的基数是16。第二个参数用于调试:它可以指向无法转换的十六进制字符串中的第一个字符。

确定。斯特尔做到了

int main()
{
    char s[] = "0xf0f0";
    unsigned int x=0;

    x = strtol(s, NULL, 16);
    printf("s = %s and x = %u\n", s, x);
}

+1.我怀疑第二个论点是否仅仅是为了调试而设计的。它似乎可以继续解析给我。啊!因此,您可以将其用作一般标记化的一部分。我没想到。(我使用它的所有情况都有一个更通用的标记器,并使用
strtol
获取已知为整数的字符串的值……因此我总是将
NULL
传递给
endptr
)并检查错误。如果返回零,则需要区分成功的零解析和失败的解析。此外,如果需要前导“0x”,则可以将基保留为0。以0为基数将根据前缀解析十进制、八进制和十六进制数字。+1。这就是原因。这与如今更常见的习惯用法相反,这种习惯用法将返回值传递回out参数,并将返回值用于错误代码。请随时使用您的解决方案更新问题,并将有用的内容标记为“答案”。