Hex to Decimal conversion [K&R exercise]

后端 未结 8 1949
梦如初夏
梦如初夏 2021-01-02 23:35

I\'m learning C and I can\'t figure out one of the K&R exercises, the listing:

Exercise 2-3, Write the function htoi(s), which conv

8条回答
  •  Happy的楠姐
    2021-01-02 23:50

    Yesterday I wrote a function like this. You can see my code below.

    /* Converting a hex string to integer, assuming the heading 
       0x or 0X has already been removed and pch is not NULL */
    int hex_str_to_int(const char* pch) {
    
        int value = 0;
        int digit = 0;
    
        for (; *pch; ++pch) {
    
            if (*pch >= '0' && *pch <= '9') {
                digit = (*pch - '0');
            } else if (*pch >= 'A' && *pch <= 'F') {
                digit = (*pch - 'A' + 10);
            } else if (*pch >= 'a' && *pch <= 'f') {
                digit = (*pch - 'a' + 10);
            } else {
                break;
            }
    
            // Check for integer overflow
            if ((value *= 16) < 0 || (value += digit) < 0) {
                return INT_MAX;
            }
        }
    
        return value;
    }
    

    Here is the testing code:

    int main(void) {
    
        printf("%d %d\n", hex_str_to_int("0"), 0x0);
        printf("%d %d\n", hex_str_to_int("A"), 0xA);
        printf("%d %d\n", hex_str_to_int("10"), 0x10);
        printf("%d %d\n", hex_str_to_int("A1"), 0xA1);
        printf("%d %d\n", hex_str_to_int("AB"), 0xAB);
        printf("%d %d\n", hex_str_to_int("100"), 0x100);
        printf("%d %d\n", hex_str_to_int("1A2"), 0x1A2);
        printf("%d %d\n", hex_str_to_int("10A"), 0x10A);
        printf("%d %d\n", hex_str_to_int("7FFFFFF"), 0x7FFFFFF);
        printf("%d %d\n", hex_str_to_int("7FFFFFF1"), 0x7FFFFFF1);
        printf("%d %d\n", hex_str_to_int("7FFFFFF2"), 0x7FFFFFF2);
        printf("%d %d\n", hex_str_to_int("7FFFFFFE"), 0x7FFFFFFE);
        printf("%d %d\n", hex_str_to_int("7FFFFFFF"), 0x7FFFFFFF);
        printf("%d %d\n", hex_str_to_int("80000000"), 0x7FFFFFFF + 1);
        printf("%d %d\n", hex_str_to_int("80000001"), 0x7FFFFFFF + 2);
    
        printf("%d %d\n", hex_str_to_int("10AX"), 0x10A);   
        printf("%d %d\n", hex_str_to_int("203!"), 0x203);
    
        return 0;
    }
    

    It outputs the following values:

    0 0
    10 10
    16 16
    161 161
    171 171
    256 256
    418 418
    266 266
    134217727 134217727
    2147483633 2147483633
    2147483634 2147483634
    2147483646 2147483646
    2147483647 2147483647
    2147483647 -2147483648
    2147483647 -2147483647
    266 266
    515 515
    

提交回复
热议问题