c语言判断是否为合法16进制字符串,再转成10进制?

编写两个函数:主函数输入、输出及调用函数,功能函数先检测输入数据是否合法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;

}

温馨提示:答案为网友推荐,仅供参考

相关了解……

你可能感兴趣的内容

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