返回

C语言常用转换函数实现原理

后端







C语言中提供了许多函数来帮助我们进行数据转换,比如`atoi()`函数可以将字符串转换成整数,`itoa()`函数可以将整数转换成字符串,`strtol()`函数可以将字符串转换成长整数,`ltoa()`函数可以将长整数转换成字符串,等等。

这些函数的原理其实都差不多,都是通过逐位转换来实现的。比如,`atoi()`函数首先会检查字符串的第一个字符是不是数字,如果是,就将它转换成数字,然后检查第二个字符,以此类推,直到遇到非数字字符为止。最后,将这些数字组合起来,就得到了一个整数。

```C
#include <stdio.h>
#include <stdlib.h>

int main() {
  char str[] = "123";
  int num = atoi(str);
  printf("%d\n", num); // 输出结果为 123

  char str2[] = "0x123";
  int num2 = strtol(str2, NULL, 16);
  printf("%d\n", num2); // 输出结果为 291

  char str3[] = "3.14";
  double num3 = atof(str3);
  printf("%f\n", num3); // 输出结果为 3.140000

  return 0;
}
当然,这些函数也有各自的局限性。比如,`atoi()`函数只能将字符串转换成整数,而不能将字符串转换成浮点数。如果要将字符串转换成浮点数,可以使用`atof()`函数。

除了这些标准库函数之外,我们也可以自己编写函数来实现数据转换。比如,我们可以编写一个函数来将字符串转换成十六进制数字。

```C
#include <stdio.h>
#include <stdlib.h>

int hex2dec(char ch) {
  if (ch >= '0' && ch <= '9') {
    return ch - '0';
  } else if (ch >= 'A' && ch <= 'F') {
    return ch - 'A' + 10;
  } else if (ch >= 'a' && ch <= 'f') {
    return ch - 'a' + 10;
  } else {
    return -1;
  }
}

int str2hex(char *str) {
  int result = 0;
  int len = strlen(str);
  for (int i = 0; i < len; i++) {
    int digit = hex2dec(str[i]);
    if (digit == -1) {
      return -1;
    }
    result = result * 16 + digit;
  }
  return result;
}

int main() {
  char str[] = "123ABC";
  int num = str2hex(str);
  printf("%d\n", num); // 输出结果为 745679

  return 0;
}

希望通过这篇博文,大家对C语言中的数据转换有了更深入的了解。