编写两个函数:主函数输入、输出及调用函数,功能函数先检测输入数据是否合法16进制字符串,如果合法则将其转换为10进制字符串
没有学指针
c语言表示16进制,0x开头(x可大写可小写),后面跟0~9,A~F的字符。
输入按照上面规则验证输入,开头两个字符可不用输入,固定初值。后面循环接收字符输入并验证。
16进制转10进制就是从个位开始取,依次乘16的n次方(n初值0),之后将乘积累加。
没有用指针!(输入的字符数组作为返回值返回必须用指针接收,接收后和数组一样使用,这个你能看明白,除此没有指针,你要是连这个都不想用,那输入就不要写成独立函数,你把input16这个函数内容全部复制到main函数中直接使用,就不需要返回值了)。
#include<stdio.h>
#include<string.h>
#define M16 4//16进制数最大位数
char *input16();
int n16ToN10(char *n16);
int main()
{
int n10;
char *n16=NULL;
n16=input16();
if(n16[2]!=0)
{
printf("输入的16进制数为:%s\n",n16);
n10=n16ToN10(n16);
printf("转成10进制的数为:%d\n",n10);
}
return 0;
}
int n16ToN10(char *n16)
{
int n,sum=0,pow16=1,i,j,len=strlen(n16);
for(i=len-1;i>=2;i--)
{
j=len-i-1;
while(j--)
pow16*=16;
if(n16[i]>='0' && n16[i]<='9')
n=n16[i]-'0';
if(n16[i]>='A' && n16[i]<='F')
n=n16[i]-'A'+10;
if(n16[i]>='a' && n16[i]<='f')
n=n16[i]-'a'+10;
sum+=n*pow16;
pow16=1;
}
return sum;
}
char *input16()
{
int i,flag=1;
static char n16[M16+3];
char c=0;
while(1)
{
if(flag)
printf("请输入%d位16进制数(0~9,A~F)0x",M16),i=2,n16[0]='0',n16[1]='x',flag=0;
c=getchar(),n16[i]=c,i++;
if(c!='\n' && !((c>='0' && c<='9')||(c>='A' && c<='F')||(c>='a' && c<='f')))
{
printf("输入超出16进制范围,请重新输入!\n\n");
flag=1,i=2;
fflush(stdin);
continue;
}
if(c=='\n' || i>M16+1)
{
fflush(stdin);
break;
}
}
if(c=='\n') n16[i-1]=0;
else n16[i]=0;
return n16;
}