網(wǎng)站首頁(yè) 編程語言 正文
題目描述
輸入一個(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é)果
原文鏈接:https://blog.csdn.net/m0_73222051/article/details/128065456
相關(guān)推薦
- 2022-07-22 Python ModuleNotFoundError: No module named通俗的解釋和方
- 2022-06-29 Oracle中的分析函數(shù)匯總_oracle
- 2024-03-18 JDK版本對(duì)應(yīng)其bytecode version (major version)
- 2022-09-30 Docker容器harbor私有倉(cāng)庫(kù)部署和管理_docker
- 2022-05-11 C++類繼承時(shí)的構(gòu)造函數(shù)_C 語言
- 2022-05-27 python中torch.nn.identity()方法詳解_python
- 2022-07-12 aqs原理初探以及公平鎖和非公平鎖實(shí)現(xiàn)
- 2022-04-30 Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)通用數(shù)據(jù)庫(kù)分頁(yè)_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支