我正在研究一个C程序,我遇到了一个小问题。我不知道如何将整数(比如2007)转换为char数组。 C库中有一个函数可以帮我吗?
为了澄清,我想把2007年存储在一些char数组中[4] = {'2','0','0','7','\ 0'};
我在想像sprintf,但我不确定。无论如何,任何帮助/提示将不胜感激。
谢谢, 迈克尔
答案 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 );