在标准C中将int转换为字符串

时间:2016-03-29 03:31:21

标签: c

我是C的新手。

我正在寻找一个示例,我可以调用一个函数将int转换为字符串。我发现itoa但这不是标准C的一部分。

我还发现sprintf(str, "%d", aInt);,但问题是我不知道所需str的大小。因此,我怎样才能为输出字符串传递正确的大小

5 个答案:

答案 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;。