首頁 > 軟體

C語言實現十六進位制轉換為十進位制的方法詳解

2022-11-28 22:01:51

題目描述

輸入一個十六進位制數位串,將其轉換成為對應的整數並輸出轉換結果,遇到非十六進位制數位或字串結束符('')結束轉換。

注意: 輸入的字串的長度不會超過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]!='')
    {
        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  **********/
}

上面程式碼不夠完善,當遇到一些特殊情況(當出現非16進位制的字元的時候)就會出錯,例如:

測試輸入:5r //程式的輸入不會有十六進位制的字首

預期輸出:5

實際輸出:80

問題在於:

我們使用字元的長度n(程式中以len代替)來決定 5*,r也被記錄在內,導致多乘了一個16。

而且對迴圈的結束條件設定的不合理,如果輸入的例子為5r123,那麼就會被計算為

優化演演算法

#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進位制數記錄在內
    while ((str[i] >= 'a' && str[i] <= 'f') || (str[i] >= 'A' && str[i] <= 'F') || (str[i] >= '0' && str[i] <= '9'))
    {
        len++;
        i++;
    } //遍歷陣列記錄16進位制數的個數,非16進位制數不計在內 
    i = 0;
    while (str[i] != '')
    {
        //字元轉數位
        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--;//每讀取一位就使長度-1
    }
    printf("%dn", sum);
    /**********  End  **********/
}

補充辦法

除了以上方法,小編為為大家整理了一些其他方法實現十六進位制轉十進位制,需要的可以參考一下

#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 == '')
		return sum * index;
	return INT_MAX;
}
int main()
{
	printf("%dn", Get_0x("0x123ABcW"));
	printf("%dn", Get_0x("0X123ABc"));
	printf("%dn", Get_0x("      0x123ABc"));
	printf("%dn", Get_0x("+0x123ABc"));
	printf("%dn", Get_0x("-0x123ABc"));
	printf("%dn", Get_0x("  +0x123ABc"));
	printf("%dn", Get_0x("   -0x123ABc"));
    return 0;
}

偵錯結果

到此這篇關於C語言實現十六進位制轉換為十進位制的方法詳解的文章就介紹到這了,更多相關C語言十六進位制轉十進位制內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com