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

