日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

C語言實現(xiàn)十六進制轉換為十進制的方法詳解_C 語言

作者:暢游星辰大海 ? 更新時間: 2022-12-26 編程語言

題目描述

輸入一個十六進制數(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也被記錄在內,導致多乘了一個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ù)記錄在內
    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ù)不計在內 
    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;
}

調試結果

原文鏈接:https://blog.csdn.net/m0_73222051/article/details/128065456

欄目分類
最近更新