最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實(shí)現(xiàn)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的方法詳解

 更新時(shí)間:2022年11月28日 15:52:38   作者:暢游星辰大海  
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下

題目描述

輸入一個(gè)十六進(jìn)制數(shù)字串,將其轉(zhuǎn)換成為對(duì)應(yīng)的整數(shù)并輸出轉(zhuǎn)換結(jié)果,遇到非十六進(jìn)制數(shù)字或字符串結(jié)束符('\0')結(jié)束轉(zhuǎn)換。

注意: 輸入的字符串的長(zhǎng)度不會(huì)超過100;轉(zhuǎn)換后的值不會(huì)超出int類型的范圍。

1.測(cè)試輸入:55 //程序的輸入不會(huì)有十六進(jìn)制的前綴

預(yù)期輸出:85

2.測(cè)試輸入:f1r2 //程序的輸入不會(huì)有十六進(jìn)制的前綴

預(yù)期輸出:241

補(bǔ)充知識(shí)

十六進(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í)候)就會(huì)出錯(cuò),例如:

測(cè)試輸入:5r //程序的輸入不會(huì)有十六進(jìn)制的前綴

預(yù)期輸出:5

實(shí)際輸出:80

問題在于:

我們使用字符的長(zhǎng)度n(程序中以len代替)來決定 5*,r也被記錄在內(nèi),導(dǎo)致多乘了一個(gè)16。

而且對(duì)循環(huán)的結(jié)束條件設(shè)置的不合理,如果輸入的例子為5r123,那么就會(huì)被計(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);//這種方法會(huì)將非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--;//每讀取一位就使長(zhǎng)度-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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode(59.螺旋矩陣之二)

    C++實(shí)現(xiàn)LeetCode(59.螺旋矩陣之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(59.螺旋矩陣之二),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實(shí)例(串口助手開發(fā))

    Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實(shí)例(串口助手開發(fā))

    這篇文章主要介紹了Qt串口通信開發(fā)之Qt串口通信模塊QSerialPort開發(fā)完整實(shí)例(串口助手開發(fā)),需要的朋友可以參考下
    2020-03-03
  • C++ STL中的常用遍歷算法分享

    C++ STL中的常用遍歷算法分享

    這篇文章主要為大家詳細(xì)介紹了C++ STL中兩個(gè)常用的遍歷算法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)與借鑒價(jià)值,感興趣的小伙伴可以參考一下
    2022-12-12
  • C語言實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲完整代碼

    C語言實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲完整代碼

    大家好,本篇文章主要講的是C語言實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲完整代碼,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C++ std::map幾種遍歷方式(正序倒序)

    C++ std::map幾種遍歷方式(正序倒序)

    這篇文章主要介紹了C++ std::map幾種遍歷方式,包含正序遍歷和倒序遍歷,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • C++操作.json文件的超詳細(xì)新手教程

    C++操作.json文件的超詳細(xì)新手教程

    最近因?yàn)轫?xiàng)目原因需要解析JSON格式數(shù)據(jù),所以這篇文章主要給大家介紹了關(guān)于C++操作.json文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 貪吃蛇游戲C++命令行版實(shí)例代碼

    貪吃蛇游戲C++命令行版實(shí)例代碼

    這篇文章主要介紹了貪吃蛇游戲C++命令行版實(shí)例代碼,包含了常見的循環(huán)語句及相關(guān)游戲規(guī)則的判定方法,有助于更好的理解游戲設(shè)計(jì)原理,需要的朋友可以參考下
    2014-09-09
  • C++中jsoncpp庫(kù)和nlohmann-json庫(kù)實(shí)現(xiàn)JSON與字符串類型轉(zhuǎn)換

    C++中jsoncpp庫(kù)和nlohmann-json庫(kù)實(shí)現(xiàn)JSON與字符串類型轉(zhuǎn)換

    jsoncpp是ROS自帶的一個(gè)JSON庫(kù),它提供了一些函數(shù)來解析和生成JSON數(shù)據(jù),在ROS中,可以使用jsoncpp庫(kù)來實(shí)現(xiàn)JSON與字符串類型之間的轉(zhuǎn)換,這篇文章主要介紹了jsoncpp庫(kù)和nlohmann-json庫(kù)實(shí)現(xiàn)JSON與字符串類型轉(zhuǎn)換,需要的朋友可以參考下
    2023-08-08
  • C++堆和棧的區(qū)別與聯(lián)系講解

    C++堆和棧的區(qū)別與聯(lián)系講解

    今天小編就為大家分享一篇關(guān)于C++堆和棧的區(qū)別與聯(lián)系講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C語言實(shí)現(xiàn)彈跳小球動(dòng)畫

    C語言實(shí)現(xiàn)彈跳小球動(dòng)畫

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)彈跳小球動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論

中西区| 老河口市| 来宾市| 内乡县| 北安市| 通州区| 金山区| 兴义市| 沅陵县| 马关县| 泰安市| 泾川县| 克拉玛依市| 大同县| 沧州市| 云安县| 衡南县| 武安市| 达拉特旗| 堆龙德庆县| 读书| 贵定县| 梨树县| 察哈| 徐州市| 巴彦淖尔市| 新野县| 穆棱市| 南溪县| 隆回县| 岳普湖县| 五大连池市| 伊春市| 修文县| 叙永县| 繁峙县| 宜川县| 永城市| 班玛县| 洪湖市| 且末县|