问题描述
编写函数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;
}