我构建了这个函数,它接受带有十六进制值的char并将值作为整数返回,十六进制char值可以用0x
或0X
加注星标,并且可以有较低或较高的字符,你必须检查是否是正确的十六进制值,如果不返回-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改进此代码,或者以其他方式执行此操作吗?