C程序设计语言习题2-3答案

问题描述

编写函数htoi(s), 把由十六进制数字组成的字符串(包含可选的前缀0X和0x),转化为与之等价的整数值, 字符串中包含的字符可以是0 - 9,A - F,a - f。

问题拆分

  • 主函数main
  • 接收用户输入字符串函数 get_line (注意不能按照书本上的getline,因为次函数已在stdio.h 中定义了)
  • 将十六进制字符串转化成十进制整数(这是核心)

代码实现

#include<stdio.h>

#define LINE 1000  //每行接收的最大字符数
#define DEC 10     //数字10
#define HEX 16     //数字16

int get_line(char s[]);
int htoi(char s[]);

int main()
{
    char line[LINE];
    int len;
    int dec;

    while(len = get_line(line) > 0){
        printf("Hex is: %s \n", line);
        dec = htoi(line);
        printf("Dec is: %d \n", dec);
    }
    return 0;
}
//接收每次输入的字符,并返回长度
int get_line(char s[])
{
    int i;
    char c;

    for(i = 0; i < LINE - 1 && (c = getchar()) != EOF && c != '\n'; i++){
        s[i] = c;
    }
    s[i] = '\0';
    return i;
}

/*
 *十六进制字符串转为十进制整数,
 *算法描述: 例如输入字符串 0x32, 那么result = 3 * 16^1 + 2 * 16 ^ 0
 */
int htoi(char s[])
{
    int dec, len, i, n, j, ji, k;
    len = 0;
    dec = 0;
    while(s[len] != '\0'){
        len++;  //获取字符串长度
    }
    //return len;
    j = 0;
    for(i = len - 1; i >= 2; i--){
            //处理不同字符串
        if(s[i] >= '0' && s[i] <= '9'){
            n = s[i] - '0';        
        }else if(s[i] >= 'a' && s[i] <= 'f'){
            n = s[i] - 'a' + DEC;
        }else if(s[i] >= 'A' && s[i] <= 'F'){
            n = s[i] - 'A' + DEC;
        }
        
        ji = 1;
        if(j == 0){
            ji = 1;
        }else{
            k = j;
            while(k > 0){
                ji = ji * HEX;
                k--;
            }
        }
        j++;
        dec = dec + ji * n;
    }
    return dec;
}
上一篇:C程序设计语言第二版习题2-8


下一篇:k-means分群