C語言實現(xiàn)十六進制轉換為十進制的方法詳解
題目描述
輸入一個十六進制數(shù)字串,將其轉換成為對應的整數(shù)并輸出轉換結果,遇到非十六進制數(shù)字或字符串結束符('\0')結束轉換。
注意: 輸入的字符串的長度不會超過100;轉換后的值不會超出int類型的范圍。
1.測試輸入:55 //程序的輸入不會有十六進制的前綴
預期輸出:85
2.測試輸入:f1r2 //程序的輸入不會有十六進制的前綴
預期輸出:241
補充知識
十六進制轉換為十進制的做法:

算法分析
#include<stdio.h>
#include<string.h>
void conversion(char str[]){
/********** Begin **********/
int i=0,j=0,num=0,sum=0;
int len=strlen(str);
while(str[i]!='\0')
{
if(str[i]>='0'&&str[i]<='9')
num=str[i]-'0';
else if(str[i]>='a'&&str[i]<='f')
num=str[i]-'a'+10;
else if(str[i]>='A'&&str[i]<='F')
num=str[i]-'A'+10;
else
break;
for(j=0;j<len-1;j++)
{
num=num*16;
}
sum+=num;
i++;
len--;
}
printf("%d",sum);
/********** End **********/
}
上面代碼不夠完善,當遇到一些特殊情況(當出現(xiàn)非16進制的字符的時候)就會出錯,例如:
測試輸入:5r //程序的輸入不會有十六進制的前綴
預期輸出:5
實際輸出:80
問題在于:
我們使用字符的長度n(程序中以len代替)來決定 5*,r也被記錄在內(nèi),導致多乘了一個16。
而且對循環(huán)的結束條件設置的不合理,如果輸入的例子為5r123,那么就會被計算為
優(yōu)化算法
#include<stdio.h>
#include<string.h>
void conversion(char str[])
{
/********** Begin **********/
int i = 0, j=0,num = 0, sum = 0,len=0;
//int len = strlen(str);//這種方法會將非16進制數(shù)記錄在內(nèi)
while ((str[i] >= 'a' && str[i] <= 'f') || (str[i] >= 'A' && str[i] <= 'F') || (str[i] >= '0' && str[i] <= '9'))
{
len++;
i++;
} //遍歷數(shù)組記錄16進制數(shù)的個數(shù),非16進制數(shù)不計在內(nèi)
i = 0;
while (str[i] != '\0')
{
//字符轉數(shù)字
if (str[i] >= '0' && str[i] <= '9')
num = str[i] - '0';
else if (str[i] >= 'a' && str[i] <= 'f')
num = str[i] - 'a' + 10;
else if (str[i] >= 'A' && str[i] <= 'F')
num = str[i] - 'A' + 10;
else
break;//遇到'\0'之前的第一個非十六進制數(shù)就停止循環(huán)
for (j = 0; j < len - 1; j++)
{
num = num * 16;
}
sum += num;
i++;
len--;//每讀取一位就使長度-1
}
printf("%d\n", sum);
/********** End **********/
}
補充辦法
除了以上方法,小編為為大家整理了一些其他方法實現(xiàn)十六進制轉十進制,需要的可以參考一下
#include<stdio.h>
#include<ctype.h>
int Get_0x(const char *str)
{
int sum = 0;
while(isspace(*str))
{
str++;
}
//此時 空格處理結束
int index = 1;
if(*str=='-' || *str=='+')
{
if(*str=='-')
{
index *= -1;
}
else
{
index = 1;
}
str++;
}
if((*str=='0') && (*(str+1)=='x'|| *(str+1)=='X'))
{
str+=2;
}
else
{
return INT_MAX;
}
while(isxdigit(*str))
{
if(isdigit(*str))
{
sum = sum*16 + (*str-'0');
}
else if(islower(*str))
{
sum = sum*16 + (*str-'a'+10);
}
else
{
sum = sum*16 + (*str-'A'+10);
}
str++;
}
if(*str == '\0')
return sum * index;
return INT_MAX;
}
int main()
{
printf("%d\n", Get_0x("0x123ABcW"));
printf("%d\n", Get_0x("0X123ABc"));
printf("%d\n", Get_0x(" 0x123ABc"));
printf("%d\n", Get_0x("+0x123ABc"));
printf("%d\n", Get_0x("-0x123ABc"));
printf("%d\n", Get_0x(" +0x123ABc"));
printf("%d\n", Get_0x(" -0x123ABc"));
return 0;
}調試結果

到此這篇關于C語言實現(xiàn)十六進制轉換為十進制的方法詳解的文章就介紹到這了,更多相關C語言十六進制轉十進制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++實現(xiàn)LeetCode(59.螺旋矩陣之二)
這篇文章主要介紹了C++實現(xiàn)LeetCode(59.螺旋矩陣之二),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07
Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實例(串口助手開發(fā))
這篇文章主要介紹了Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實例(串口助手開發(fā)),需要的朋友可以參考下2020-03-03
C++中jsoncpp庫和nlohmann-json庫實現(xiàn)JSON與字符串類型轉換
jsoncpp是ROS自帶的一個JSON庫,它提供了一些函數(shù)來解析和生成JSON數(shù)據(jù),在ROS中,可以使用jsoncpp庫來實現(xiàn)JSON與字符串類型之間的轉換,這篇文章主要介紹了jsoncpp庫和nlohmann-json庫實現(xiàn)JSON與字符串類型轉換,需要的朋友可以參考下2023-08-08

