我是C的新手。
我正在寻找一个示例,我可以调用一个函数将int
转换为字符串。我发现itoa
但这不是标准C的一部分。
我还发现sprintf(str, "%d", aInt);
,但问题是我不知道所需str的大小。因此,我怎样才能为输出字符串传递正确的大小
答案 0 :(得分:5)
有多种方法可以适当调整数组的大小以考虑sizeof(int)
的变化,但乘以4对于基数10来说就足够了。sizeof(int)==1
的边缘情况需要+1。 / p>
int x; // assign a value to x
char buffer[sizeof(int) * 4 + 1];
sprintf(buffer, "%d", x);
如果需要从函数返回指向字符串的指针,则应该分配缓冲区而不是使用堆栈内存:
char* integer_to_string(int x)
{
char* buffer = malloc(sizeof(char) * sizeof(int) * 4 + 1);
if (buffer)
{
sprintf(buffer, "%d", x);
}
return buffer; // caller is expected to invoke free() on this buffer to release memory
}
答案 1 :(得分:2)
在便携式C中,最简单的方法是使用plotOptions: {
gauge: {
dial: {
radius: '100%',
backgroundColor: 'gray',
baseWidth: 20,
topWidth: 1,
baseLength: '3%', // of radius
rearLength: '10%'
}
}
}
来计算所需数组的大小,然后使用snprintf
进行实际转换。例如:
sprintf
值得注意的是,这在C99之前不会起作用,并且还有一个更简洁的替代方案,它在C99之前工作,并且对于所有整数都是类型通用的。在another answer to this question using the multiplication trick中描述了这一点,但是我注意到那里提出的技巧也不是严格便携的。在char buffer[snprintf(NULL, 0, "%d", x) + 1];
sprintf(buffer, "%d", x);
不是8的环境中(例如,某些DSP使用16位或32位字节),您需要更改乘数。
我提出了a similar trick in response to a different question。该代码使用CHAR_BIT
来确保可移植性,即使CHAR_BIT
更改也是如此。它作为一个宏呈现,因此它在内部记录;它告诉你高级描述是什么,单独乘法不能做什么。
CHAR_BIT
答案 2 :(得分:1)
使用C99 snprintf()
。它计算需要多少空间
int needed = snprintf(NULL, 0, "%s", value);
if (needed < 1) /* error */;
char *representation = malloc(needed + 1); // add 1 for '\0'
if (!representation) /* error */;
sprintf(representation, "%d", value);
// ... use representation ...
free(representation);
答案 3 :(得分:0)
有一种方法可以在没有任何功能的情况下完成,例如这(它可能有点原始,但仍然):
char dec_rev[255];
dec_rev[0] = '\0';
int i = 0;
while (val != 0) {
int temp = val % 10;
dec_rev[i] = temp + '0';
//printf("%c\n", dec_rev[i]);
val /= 10;
if (val == 0) {
dec_rev[i + 1] = '\0';
break;
}
i++;
}
char dec[255];
i = 0;
for (int j = strlen(dec_rev) - 1; j != -1; j--) {
dec[i] = dec_rev[j];
i++;
}
毕竟我们把int存储在dec [255]中。
答案 4 :(得分:0)
奇怪的是没有提到这个,但是基数10中int的表示大小是ceil(log10(value)); (如果要编写,则为log10整数版本)
因此ceil(log10(5)) => 1
和ceil(log10(555)) => 3
ceil(log10(1000000000)) => 9
显然,如果你需要,你需要一个额外的空间用于标志,而另一个空间用于&#39; \ 0&#39;。