C語言實(shí)現(xiàn)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的方法詳解
題目描述
輸入一個(gè)十六進(jìn)制數(shù)字串,將其轉(zhuǎn)換成為對應(yīng)的整數(shù)并輸出轉(zhuǎn)換結(jié)果,遇到非十六進(jìn)制數(shù)字或字符串結(jié)束符('\0')結(jié)束轉(zhuǎn)換。
注意: 輸入的字符串的長度不會超過100;轉(zhuǎn)換后的值不會超出int類型的范圍。
1.測試輸入:55 //程序的輸入不會有十六進(jìn)制的前綴
預(yù)期輸出:85
2.測試輸入:f1r2 //程序的輸入不會有十六進(jìn)制的前綴
預(yù)期輸出:241
補(bǔ)充知識
十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的做法:
算法分析
#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 **********/ }
上面代碼不夠完善,當(dāng)遇到一些特殊情況(當(dāng)出現(xiàn)非16進(jìn)制的字符的時(shí)候)就會出錯(cuò),例如:
測試輸入:5r //程序的輸入不會有十六進(jìn)制的前綴
預(yù)期輸出:5
實(shí)際輸出:80
問題在于:
我們使用字符的長度n(程序中以len代替)來決定 5*,r也被記錄在內(nèi),導(dǎo)致多乘了一個(gè)16。
而且對循環(huán)的結(jié)束條件設(shè)置的不合理,如果輸入的例子為5r123,那么就會被計(jì)算為
優(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進(jìn)制數(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進(jìn)制數(shù)的個(gè)數(shù),非16進(jìn)制數(shù)不計(jì)在內(nèi) i = 0; while (str[i] != '\0') { //字符轉(zhuǎn)數(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'之前的第一個(gè)非十六進(jìn)制數(shù)就停止循環(huán) for (j = 0; j < len - 1; j++) { num = num * 16; } sum += num; i++; len--;//每讀取一位就使長度-1 } printf("%d\n", sum); /********** End **********/ }
補(bǔ)充辦法
除了以上方法,小編為為大家整理了一些其他方法實(shí)現(xiàn)十六進(jìn)制轉(zhuǎn)十進(jìn)制,需要的可以參考一下
#include<stdio.h> #include<ctype.h> int Get_0x(const char *str) { int sum = 0; while(isspace(*str)) { str++; } //此時(shí) 空格處理結(jié)束 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; }
調(diào)試結(jié)果
到此這篇關(guān)于C語言實(shí)現(xiàn)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的方法詳解的文章就介紹到這了,更多相關(guān)C語言十六進(jìn)制轉(zhuǎn)十進(jìn)制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中引用、內(nèi)聯(lián)函數(shù)、auto關(guān)鍵字和范圍for循環(huán)詳解
本文主要梳理了C++當(dāng)中一些瑣碎的知識點(diǎn),包括有命名空間,缺省參數(shù),引用,auto關(guān)鍵字和內(nèi)聯(lián)函數(shù),文中通過實(shí)例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02C語言如何把浮點(diǎn)數(shù)轉(zhuǎn)換為字符串
這篇文章主要介紹了C語言如何把浮點(diǎn)數(shù)轉(zhuǎn)換為字符串方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12利用C語言實(shí)現(xiàn)任務(wù)調(diào)度的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用純C語言實(shí)現(xiàn)任務(wù)調(diào)度(可用于STM32、C51等單片機(jī)),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04基于C++實(shí)現(xiàn)一個(gè)日期計(jì)算器
這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)簡單的日期計(jì)算器,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-10-10使用QGraphicsView實(shí)現(xiàn)氣泡聊天窗口+排雷功能
這篇文章主要介紹了使用QGraphicsView實(shí)現(xiàn)氣泡聊天窗口+排雷,重點(diǎn)給大家介紹使用QWebEngineView控件內(nèi)嵌html+CSS的實(shí)現(xiàn)方式,需要的朋友可以參考下2022-04-04