将整数转换为数组

时间:2010-01-03 21:23:16

标签: c

我正在研究一个C程序,我遇到了一个小问题。我不知道如何将整数(比如2007)转换为char数组。 C库中有一个函数可以帮我吗?

为了澄清,我想把2007年存储在一些char数组中[4] = {'2','0','0','7','\ 0'};

我在想像sprintf,但我不确定。无论如何,任何帮助/提示将不胜感激。

谢谢, 迈克尔

8 个答案:

答案 0 :(得分:12)

您可以使用sprintf或更安全地snprintf执行此操作。

这是一个人为的例子:

#include <stdio.h>
#define MAX_LEN 5

char str[MAX_LEN];
snprintf(str, MAX_LEN, "%d", 2007);

答案 1 :(得分:4)

使用snprintf()并确保分配适当的空间量以容纳最多2 ^(sizeof(int)* CHAR_BIT)的数字。在64位计算机上,这将是20位字符,加上1为NULL终止符。

#include <stdio.h>
#define MAX_DIGITS 20

int n = 2007;   
char str[MAX_DIGITS+1];
snprintf(str, MAX_DIGITS+1, "%d", n);

答案 2 :(得分:3)

正如其他人所说,你应该看sprintf()snprintf()。假设您正在尝试将整数类型T转换为此类数组,那么有趣的是找出数组缓冲区的大小。

首先,数字十进制表示中的位数是⌊log 10 n +1⌋。无符号整数类型T的最大可能值可以用nbits = CHAR_BIT*sizeof(T)二进制位表示,这需要⌊log 10 2 nbits ⌋+ 1位小数。

log 10 2 nbits = nbits×log 10 2 = nbits×log(2)/ log(10)。

28/93是一个非常好的 1 有理近似log(2)/log(10)(0.30107526881720431 vs 0.30102999566398114)。

所以,使用上面的代码,我们得到了数字的表达式:

CHAR_BIT * sizeof(T) * 28 / 93 + 1

对于已签名的号码,我们需要为-符号再添加1个号码,我们需要为终止0添加1。所以我们得到:

#include <limits.h>
/* Figure out the maximum number of characters including the
   terminating 0 to represent the numbers in integral type T */
#define SZ(T) (CHAR_BIT * sizeof(T) * 28 / 93 + 3)

所以我们可以这样做:

char array[SZ(int)];
sprintf(array, "%d", n);

我们确信array有足够的空间。我们也不必担心snprintf()malloc() / realloc()free()组合。

以下是使用上述内容的完整程序:

#include <stdio.h>
#include <limits.h>

/* Figure out the maximum number of characters including the
   terminating 0 to represent the numbers in integral type T */
#define SZ(T) (CHAR_BIT * sizeof(T) * 28 / 93 + 3)

#define PRINT(x) do \
                 { \
                     printf("%s: %lu\n", #x, (unsigned long)SZ(x)); \
                 } while (0)

int main(void)
{
    PRINT(int);
    PRINT(long);
    PRINT(size_t);
    return 0;
}

1 或足够好用于此目的。

答案 3 :(得分:2)

#include <stdio.h>
char array[5];
sprintf(array, "%d", 2007);

...进行。

请注意,sprintf不是溢出安全的,因此如果您有5位或更多位数,则会出现问题。另请注意,转换后的数字后面会跟一个终止\0

答案 4 :(得分:1)

使用snprintf

// value is int;
// buf is char *;
// length is space available in buf
snprintf(buf, length, "%d", value)

snprintf具有标准的优势,可以提供更大的格式灵活性和安全性。

您也可以使用itoa,但要注意它不是标准的一部分。大多数实现都有它。

用法:

// value is int;
// buf is char *;
itoa(value, buf, 10);

一个有趣的问题是:您为buf分配了多少空间?我们注意到以下内容。每sizeof(int)int个字节,每个字节8位,最大值约为2^(CHAR_BIT * sizeof(int) - 1)-1用于符号位)。因此我们需要空间来容纳

floor(log_10(2^(CHAR_BIT * sizeof(int) - 1)) + 1

数字。但是不要忘记符号和null终结符!所以这里可表示的整数的最大长度是

floor(log_10(2^(CHAR_BIT * sizeof(int) - 1)) + 3.

当然,如果我们的价值观很小,这可能会浪费空间。要了解特定值需要多少空间:

floor(log_10(abs(value))) + 1 + (value < 0 ? 1 : 0) + 1

答案 5 :(得分:1)

经典的方式是itoa。或者您可以使用snprintf来获得更多控制权。

答案 6 :(得分:1)

根据我的理解,有一个非标准但受到良好支持的函数itoa - 与atoi相反。

示例:

char *a = malloc(10 * sizeof(char));
itoa(2007, a, 2007);

sprintf也有效:

char *a = malloc(10 * sizeof(char));
sprintf(a, "%d", 2007);

答案 7 :(得分:1)

int n = 2007;
char a[100];
sprintf( a, "%d", n );