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

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

问题描述

编写函数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;
}
目录
相关文章
|
6月前
|
存储 算法 C语言
C语言初学者超详细习题库1(含题目以及代码讲解)
C语言初学者超详细习题库1(含题目以及代码讲解)
100 1
|
存储 C语言
明解C语言第六章习题
明解C语言第六章习题
|
C语言
明解C语言第七章习题
明解C语言第七章习题
|
C语言
明解C语言第八章习题
明解C语言第八章习题
|
C语言
明解C语言第五章习题
明解C语言第五章习题
|
C语言
明解C语言第四章习题
明解C语言第四章习题
|
算法
C程序设计语言第二版习题2-9
在求反码时,表达式 x &= (x - 1) 用于把x最右边的值为1的位删除掉。请解释一下这样做的道理。用这一方法重写bitcount函数 ,使之执行得更快一点
829 0
C程序设计语言第二版习题4-1
编写一个函数strrindex(s, t),用于返回字符串t在s中最右出现的位置,如果 s中不 包含t,那么返回-1。
3684 0
|
机器学习/深度学习 算法 JavaScript
C程序设计语言第二版习题3-6
修改itoa函数,使得该函数可以接收三个参数。其中,第三个参数为最小字段宽度。为了保证转换后所得的结果至少具有第三个参数指定的最小宽度,在必要时应在所得结果的左边填充一定的空格。
758 0
|
机器学习/深度学习 算法 JavaScript
C程序设计语言第二版习题3-5
编写函数itob(n, s, b) ,用于把整数n转换成以b为基数的字符串并存到字符串s中。例如, itob(n, s, 16) 表示将n转换成16进制数,并存入s中。
980 0