获取具有十六进制值的char并将该值作为整数返回

时间:2017-04-06 21:26:02

标签: c

我构建了这个函数,它接受带有十六进制值的char并将值作为整数返回,十六进制char值可以用0x0X加注星标,并且可以有较低或较高的字符,你必须检查是否是正确的十六进制值,如果不返回-1。

我在问你是否可以改进这段代码或以更有效的方式进行,我不能使用c或其他库只使用c核心。只是c没有c ++。

long long unsigned int atoi_hexadecimal(char s[])
{
    long long unsigned int num = 0;
    long long unsigned int size = 0;
    long long unsigned i=0;

    while(s[i]!='\0')
        i++;
    size=i;


    for(i=0 ; (((s[i]>='0') && (s[i]<='9')) || ((s[i]>='A') && (s[i]<='F')) || ((s[i]>='a') && (s[i]<='f')) || ((s[i]=='x') || (s[i]=='X'))); ++i)
    {
        if((i==0) && (s[i]!='0'))
            return -1;
        else if ((i==1) && (s[i]!='x') && (s[i]!='X'))
            return -1;
        else if ((s[i]>='A') && (s[i]<='F'))
                num = num + (s[i]-'A'+10)*power(16,size-i-1);
        else if ((s[i]>='a') && (s[i]<='f'))
                num = num + (s[i]-'a'+10)*power(16,size-i-1);
        else if ((s[i]>='0') && (s[i]<='9') && (i!=0))
                num = num + (s[i]-'0')*power(16,size-i-1);
        else if ((i!=0) && (s[i]!=0) && (s[i]!='x') && (s[i]!='X'))
            return -1;
    }

    if(i==size)
        return num;
    else return -1;
}

double power(double base, double exp)
{
    double p=1;

    for(int i=0; i<exp; i++)
    {
        p=p*base;
    }

    return p;
}

使用示例

printf("%llu \n",atoi_hexadecimal("0XF15"));

任何人都可以为包含hex到int值的转换char改进此代码,或者以其他方式执行此操作吗?

2 个答案:

答案 0 :(得分:1)

long int strtol(const char *str, char **endptr, int base)

会帮助你

thisthis

确保输入正确并继续

答案 1 :(得分:0)

如果您#include <stdlib.h>,则有相应的功能。将16作为基数。