#include <stdio.h>
#include <string.h>
/* 传进一个整数和次方数
* 返回整数的n次方 */
int power(int num, int n)
{
int result = 1;
if (n == 0){
return result;
}else{
while(n > 0){
result *= num;
n--;
}
}
return result;
}
/* 传进一个以0x或0X开头的16位数字计数法表示的字符串
* 返回十进制数 */
int htoi(const char *str)
{
if (NULL == str){
return -1;
}
int result = 0;
int len = (int) strlen(str);
int dig = len - 3; //最高位的次方数为n-1
char tmp[len+1];
strcpy(tmp, str);
//转换为10进制需要有该数的值以及次方
//字符串长度减去3(0x 和 最高位次方数为 n-1)为十六进制数最高位次方数
//值用(int)进行类型转换
//次方用字符串长度减去3(0x 和 最高位次方数为 n-1)表示
//计算完一个字符后,跳向下一个字符,次方数减1
//从左往右找到x后的第一个字符
int i = 0;
while (tmp[i] != 'x' && tmp[i] != 'X' && i < len){
i++;
}
//结束后指向x,需要往后挪一位
i++;
//此时指向最高位
if (tmp[i] == '\0'){
printf("input error.\n");
return -1;
}
while (tmp[i] != '\0') {
//判断是否为0-9
if (tmp[i] <= '9' && tmp[i] >= '0'){
//类型转换为数字,加上次方,赋值给保存变量
result += ((int) tmp[i] - 48) * power(16, dig);
dig--;
}
//判断是否为a-f
else if (tmp[i] <= 'f' && tmp[i] >= 'a'){
result += ((int) tmp[i] - 97 + 10)* power(16, dig); //+10是因为a表示10
dig--;
}else if (tmp[i] <= 'F' && tmp[i] >= 'A'){
//为A到F
result += ((int) tmp[i] - 65 + 10)* power(16, dig);
dig--;
}
else{
printf("input error.\n");
return -2;
}
i++;
}
return result;
}
int main(int argc, char *argv[])
{
char str[50] = {0};
int result = 0;
printf("convert a hexadecimal number to a decimal one\n");
while (1) {
printf("please input a hexadecimal number: (0x + number)\n"
"exit with(exit)\n");
scanf("%s", str);
if (strcmp(str, "exit") == 0){
break;
}
result = htoi(str);
if (result >= 0) {
printf("the decimal number is: %d\n", result);
}
}
printf("\n");
return 0;
}
十六进制字符串转化为十进制数
最新推荐文章于 2023-11-21 15:50:41 发布