在C/C++中实现itoa()函数

时间:2020-02-23 14:30:00  来源:igfitidea点击:

在本文中,我们将介绍如何在C/C++中实现itoa()函数。

这是一个有用的实用程序函数,它将整数转换为以null终止的字符串。

但是,大多数编译器本身都不支持它,因为它不是C标准的一部分。

因此,让我们来看看如何通过自己实现此功能!

C/C++中itoa()函数的基本语法

尽管此功能在某些编译器中可用,但在大多数编译器中都没有这样的功能。

itoa()函数采用整数" num",并将其存储到" buffer"中。
它还具有一个可选的参数base,它将其转换为适当的基数。

默认情况下," base"设置为10(十进制)。

如果转换成功,则填充" buffer"后,它将返回指向" buffer"的第一个字符的指针。
否则,它返回NULL。

char* itoa(int num, char* buffer, int base)

由于在大多数常见的C编译器中没有默认的itoa()函数,因此让我们实现它!

在C/C++中实现itoa()函数

我们将取一个数字,并将其转换为字符串。
我们将考虑正整数和负整数,并查看itoa()如何处理它们。

尽管某些可能已经通过从右到左评估数字然后反转字符串来实现itoa(),但是我们将使用另一种方法。
Ť

在<math.h>库中的某些功能的帮助下,我们将从左至右评估数字。

我们将按照以下步骤操作:

  • 查找" num"的位数。
    如果num为正数,我们知道位数将为floor(log(num(base,base)))+ 1
    (提示:使用对数很容易得出)。

  • 如果num为负,则仅考虑base = 10的情况,因为我们可能需要使用单独的算法来评估任何base。
    我们需要将减号放在第一位!

  • 从" num"的最左(最高)位开始,然后继续将值添加到缓冲区中。

完整的程序如下所示。
通过阅读代码,您也许可以更好地理解这一点!

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

char* itoa(int num, char* buffer, int base) {
  int curr = 0;

  if (num == 0) {
      //Base case
      buffer[curr++] = '0';
      buffer[curr] = '
Input = 1234, base = 10, Buffer = 1234
Input = -231, base = 10, Buffer = -231
Input = 10, base = 2, Buffer = 1010

'; return buffer; } int num_digits = 0; if (num &lt; 0) { if (base == 10) { num_digits ++; buffer[curr] = '-'; curr ++; //Make it positive and finally add the minus sign num *= -1; } else //Unsupported base. Return NULL return NULL; } num_digits += (int)floor(log(num)/log(base)) + 1; //Go through the digits one by one //from left to right while (curr &lt; num_digits) { //Get the base value. For example, 10^2 = 1000, for the third digit int base_val = (int) pow(base, num_digits-1-curr); //Get the numerical value int num_val = num/base_val; char value = num_val + '0'; buffer[curr] = value; curr ++; num -= base_val * num_val; } buffer[curr] = '
gcc -o test.out test.c -lm

'; return buffer; } int main() { int a = 1234; char buffer[256]; if (itoa(a, buffer, 10) != NULL) { printf("Input = %d, base = %d, Buffer = %s\n", a, 10, buffer); } int b = -231; if (itoa(b, buffer, 10) != NULL) { printf("Input = %d, base = %d, Buffer = %s\n", b, 10, buffer); } int c = 10; if (itoa(c, buffer, 2) != NULL) { printf("Input = %d, base = %d, Buffer = %s\n", c, 2, buffer); } return 0; }

输出

##代码##

注意:如果您使用的是gcc,请使用-lm标志来包含数学库。

##代码##

确实,我们能够使其正常运行。
这不仅适用于整数,还适用于其他基数!