将十六进制字符串转换为int

时间:2019-06-22 05:29:31

标签: c

编写一个C函数,该函数接受一个以空值结尾的字符串(包含一个十六进制字符串),并返回整数值。您不能调用任何C库函数,但strlen()除外才能对该函数进行编码。十进制字符串将仅包含0-4个ASCII字符,从'0'到'9',从'A'到'F'。无需错误处理。如果字符串为空,则返回值0。

我一直在尝试修复错误,但是一旦修复,就会弹出新错误,使我感到困惑。

#include <stdlib.h>  /*used for EXIT_SUCCESS */
#include <stdio.h>   /*used for printf */
#include <string.h>  /* used for strlen */
#include <stdbool.h> /* used for bool */
#include <math.h>


unsigned int hexStringTouint(const char str[], int length, int n[])
{
    int i, j;
    int intvalue = 0;
    int digit;
    for(i = (length-1), j = 0; i --, j++)
    {
        if(n[i]>='0' && n[i] <='9')
        {
            digit = n[i] - 0x30;
        }
        else if(n[i]>= 'A' && n[i] <= 'F')
        {
            switch(n[i])
            {
                case 'A': digit = 10; break;
                case 'B': digit = 11; break;
                case 'C': digit = 12; break;
                case 'D': digit = 13; break;
                case 'E': digit = 14; break;
                case 'F': digit = 15; break;
            }
        }
        intvalue += digit*pow(16,j);
    }
    printf("int value is %d\n", intvalue);
    return 0;
}

int main(void)
{
    int i, length, intvalue;
    unsigned char n[] = "";
    printf("Enter your hexadecimal string: ");
    scanf("%c\n", n);
    intvalue = 0;
    length = strlen(n);
    return EXIT_SUCCESS;
}

我收到错误消息说 expected ';' in 'for' statement specifier 以及const char *如何在指针和整数之间转换。

1 个答案:

答案 0 :(得分:1)

OP的大部分代码是正确的轨道,但是仍然存在各种编码错误。

添加测试条件

// for(i = (length-1), j = 0; i --, j++)
//                         v 
for(i = (length-1), j = 0; i >= 0; i --, j++)

除strlen()以外,无法调用任何C库函数

// intvalue += digit*pow(16,j);
intvalue += digit*(1u << (4*j));

返回值

要求“ ...并返回整数值”

//int intvalue = 0;
//...
//printf("int value is %d\n", intvalue);
//return 0;

unsigned intvalue = 0;
...
printf("integer value is %u\n", intvalue);
return intvalue;

缓冲区太小

// unsigned char n[] = "";
// scanf("%c\n", n);

char n[100] = "";
scanf("%99s", n);

hexStringTouint()

main()中未调用的函数。

存在其他问题


一种更简单的方法

unsigned hexStringTouint2(const char *str) {
  unsigned value = 0;
  while (*str) {
    unsigned digit = hexCharTouint(*str);  // tbd code
    value = value*16 + digit;
    str++;
  }
  return value;
}