C语言--二进制转十六进制

题目描述
给定一个二进制表示的非负整数,将其转换为十六进制数。
要求使用函数编写程序:函数原型如下:
void convert( char *input, char *output);
变量input为读入的二进制字符串,变量output为函数中要输出的十六进制字符串

输入
输入数据有多组,第一行为数据的组数T,接下来有T组数据。
每组数据占一行,每行为一个二进制整数(不含多余的前导0),最多1000位。

输出
对于每组测试数据首先输出"Case #: ",#表示第几组测试数据,接着输出对应的十六进制数,字母用大写表示,每组测试结果占一行。

样例输入
2
1111
10100100

样例输出
Case 1: F
Case 2: A4

提示
5 = '5' - '0';

//vc6下完美运行通过
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

void convert(char *input, char *output)
{
int len1 = strlen(input); //输入二进制数位数
int pos = len1 / 4 + 1; //输出十六进制数的位数
if (len1 % 4 == 0)
{
pos = pos - 1;
}
int j = 0;
while (len1>0)
{
char sum = 0;
for (int i=0; i<4 && len1>0; i++, len1--) //从最后起每4位算一次值
{
sum = sum + (input[len1-1]-'0')*pow(2, i);
}

// 转换成16进制数表示
sum = sum + '0';
if ('9'<sum && sum<'9'+7)
{
sum = sum + 7;
}
else if (sum > '9' + 6)
{
printf("您输入的不是正确的2进制数!\n");
exit(0);
}

//十六进制数放到output数组相应位置
output[--pos] = sum;
}
}

int main()
{
int groupNum = 0;
char total[1024] = {0};
scanf("%d", &groupNum);
for (int i=1; i<=groupNum; i++)
{
char input[1024] = {0};
char output[256] = {0};
fflush(stdin); //记得清楚输入缓冲区,否则每次回车会影响
gets(input);
convert(input, output);

char format[32] = {0};
sprintf(format, "\nCase %d: ", i);
strcat(total, format);
strcat(total, output);
}

printf("%s\n", total);
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-24
看看这个行不行?希望对你有帮助……
#include "stdafx.h"
#include "stdio.h"//
#include "string.h"//
#include "conio.h"//
#include "stdlib.h"//
void convert(char *input, char *output){
int i=0,j,nx,lein,ii;
char cx;
lein=strlen(input);
if(nx=lein%4){//处理最左端不足4位的情况
for(cx=0;i<nx;(cx<<=1)+=(*(input+i++)=='1' ? 1 : 0));
*output=cx+(cx>9 ? 0x37 : '0');
i=1;
}

for(ii=nx;ii<lein;ii+=4){//每4位一组变换成字符
for(j=0,cx=0;j<4;(cx<<=1)+=(*(input+ii+j++)=='1' ? 1 : 0));
*(output+i++)=cx+(cx>9 ? 0x37 : '0');
}
*(output+i)=NULL;
}

void main(void){/*主程序*/
char i,ii,rc,(*pBin)[1001],output[251];
int nDec=0,n;
printf("要输入几组二进制数?\nnGroup=");
scanf("%d",&n);
if(!(pBin=(char (*)[1001])malloc(n*1001))){
printf("申请内存失败!\n");
exit(0);
}
for(ii=0;ii<n;ii++){
printf("请输入第%d个二进制数!\nBin%d=",ii+1,ii+1);
for(i=0;;){
if((rc=getch())==0xD || i==1000){
printf("\n");
break;//遇到回车或长度到1000位则结束输入
}
else if(rc=='\b' && i){//处理退位修改
printf("\b%c\b",' ');
i--;
}
else if(rc=='0'||rc=='1'){//只允许输入'1'和'0'
printf("%c",rc);//显示输入字符
if(!i && rc=='0') continue;//不要前导0
pBin[ii][i++]=rc;//存储输入字符
}
}
pBin[ii][i]=NULL;//设置字符串结束标记
}
for(i=0;i<n;i++){
convert(pBin[i],output);//调用自定义函数转换成十六进制串
printf("Case %d:0x%s\n",i+1,output);
}
free(pBin);
}

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网