在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 < 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 < 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标志来包含数学库。
确实,我们能够使其正常运行。
这不仅适用于整数,还适用于其他基数!