目录
输入一个十六进制数字串,将其转换成为对应的整数并输出转换结果,遇到非十六进制数字或字符串结束符('\0'
)结束转换。
注意: 输入的字符串的长度不会超过100
;转换后的值不会超出int类型的范围。
1.测试输入:
55
//程序的输入不会有十六进制的前缀预期输出:
85
2.测试输入:
f1r2
//程序的输入不会有十六进制的前缀预期输出:
241
十六进制转换为十进制的做法:
- #include
- #include
- 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
-1;j++) - {
- num=num*16;
- }
- sum+=num;
- i++;
- len--;
- }
- printf("%d",sum);
- /********** End **********/
- }
上面代码不够完善,当遇到一些特殊情况(当出现非16进制的字符的时候)就会出错,例如:
测试输入:
5r
//程序的输入不会有十六进制的前缀预期输出:5
实际输出:80
问题在于:
- #include
- #include
- 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] != '\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;//遇到'\0'之前的第一个非十六进制数就停止循环
- for (j = 0; j < len - 1; j++)
- {
- num = num * 16;
- }
- sum += num;
- i++;
- len--;//每读取一位就使长度-1
- }
- printf("%d\n", sum);
- /********** End **********/
- }
👍🏻点赞,你的认可是我创作的动力!
⭐收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!