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

我是C.的新手

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

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

有一些最佳方法可以适当地调整数组的大小以考虑sizeof(int)变化,但乘以4对于基数10来说就足够了。对于sizeof(int)==1的边缘情况,需要+1。

 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 } 

在便携式C中,最简单的方法是使用snprintf计算所需数组的大小,然后使用sprintf进行实际转换。 例如:

 char buffer[snprintf(NULL, 0, "%d", x) + 1]; sprintf(buffer, "%d", x); 

值得注意的是,这在C99之前不起作用,并且还有一个更简洁的替代方案,它在C99之前工作,并且对于所有整数都是类型通用的 。 这是在使用乘法技巧的另一个问题的答案中描述的,但是我注意到那里提出的技巧也没有严格的便携性。 在CHAR_BIT不是8的环境中(例如,某些DSP使用16位或32位字节),您需要更改乘数。

我提出了一个类似的技巧来回应一个不同的问题 。 即使CHAR_BIT发生变化,该代码也使用CHAR_BIT来确保可移植性。 它作为宏呈现,因此它在内部记录; 它告诉你高级描述是什么,单独乘法不能做什么。

 #include  #include  #include  #define digit_count(num) (1 /* sign */ \ + sizeof (num) * CHAR_BIT / 3 /* digits */ \ + (sizeof (num) * CHAR_BIT % 3 > 0)/* remaining digit */ \ + 1) /* NUL terminator */ int main(void) { short short_number = -32767; int int_number = 32767; char short_buffer[digit_count(short_number)] = { 0 }; char int_buffer[digit_count(int_number)]; sprintf(short_buffer, "%d", short_number); sprintf(int_buffer, "%d", int_number); } 

使用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); 

有一种方法可以在没有任何function的情况下完成它,例如这(它可能有点原始,但仍然):

 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]中。

奇怪的是没有提到这个,但是基数10中int的表示大小是ceil(log10(value)); (如果你想写的话,还是log10整数版)

因此ceil(log10(5)) => 1

ceil(log10(555)) => 3

 ceil(log10(1000000000)) => 9 

显然你需要一个额外的空间用于标志,如果你需要它,另一个用于’\ 0’。