在C中从十六进制转换为整数的方法,不能得到小写!

Pat*_*k C 0 c hex integer

嘿大家,只是一个快速的事情,我有十六进制到整数工作,但我需要将数字小写.这就是我所拥有的,任何想法让A到F F不区分大小写?

int htoi(char f[]) {
    int  z, n;
    n = 0;

    for (z = 0; f[z] >= '0' && f[z] <= 'F'; ++z) 
        if (f[z] >= 'A' && f[z] <= 'F')
            n = 10 + 16 * n + (f[z] - 'A');
        else
            n = 16 * n + (f[z] - '0');
}
Run Code Online (Sandbox Code Playgroud)

可能只是一件小事,但我想包括af和AF.谢谢你的帮助!

Chr*_*utz 7

如果你这样做是为了学习如何做,请忽略这篇文章.如果您正在使用此函数,因为您需要将十六进制数字的字符串转换为a int,则应该在标准库中进行操作.标准函数strtol()将字符串转换为a long,可以将其转换为int(或者是unsigned int一段时间).第三个参数是转换为的基数 - 在这种情况下,您希望16进制为十六进制.另外,如果给定基数为0,则如果字符串以字符串开头则为十六进制,如果以字符串开头0x则为octal 0,否则为十进制.这是一个非常有用的功能.


编辑:刚刚注意到这一点,但是我们在这里时,值得一提的是你通常不应该使用int索引数组.C标准定义了一个名为的类型,size_t用于存储数组索引.它通常是一个unsigned int或者unsigned long什么,但保证足够大,可以存储您可以使用的任何数组或指针偏移量.

使用a的问题int在于,从理论上讲,有一天,某人可能会传递一个字符串超过INT_MAX,然后你的int意志会溢出,可能会回绕,并开始读取内存,它可能不应该因为它使用负索引.这是非常不可能的,特别是对于这样的函数,因为int您返回的值会在int计数器溢出之前很久就会溢出,但要记住这一点很重要.

为了在技术上正确,你应该只使用size_t类型变量来索引数组,或者至少只使用unsigned类型,除非你真的想尝试访问负面元素(除非你知道你在做什么,这通常是一个坏主意).但是,这不是一个大问题.

  • 如果你的字符串长于INT_MAX,你会遇到比使用错误的数据类型更大的问题:-)我想起讲座一次,讲师说太阳会在大约50亿年后死亡.一名观众在恐惧中跳起来,并要求他重复这一点.讲师这样做了,观众成员说:"感谢上帝,我虽然你说五百万*". (2认同)