有一天,我想用C转换一个整数到一个char *,这个int可以是负数。
我无法使用sprintf,snprintf,所以我该怎么做?
答案 0 :(得分:1)
要滚动一个自己的itoa()
- 类函数,首先必须解决如何处理内存的问题。最简单的方法是为所有可能的int
值(INT_MIN
)使用足够大的内存。
所需的缓冲区大小是数学ceiling(log10(-INT_MIN))+3
。这可以近似为:
#include <limits.h>
#define INT_STR_SIZE (sizeof(int)*CHAR_BIT/3 + 3)
然后使用%10
然后使用/10
从最低有效数字开始逐个构建数字以减少数值。
通过使用do
循环,代码捕获了x==0
的极端情况,因为至少创建了一个数字。
此代码避免if (x < 0) { x = -x; ...
否定INT_MIN
(或乘以-1会导致int
溢出,即UB。
#include <limits.h>
#define INT_STR_SIZE (sizeof(int)*CHAR_BIT/3 + 3)
char *my_itoa(char *dest, size_t size, int x) {
char buf[INT_STR_SIZE];
char *p = &buf[INT_STR_SIZE - 1];
*p = '\0';
int i = x;
do {
*(--p) = abs(i%10) + '0';
i /= 10;
} while (i);
if (x < 0) {
*(--p) = '-';
}
size_t len = (size_t) (&buf[INT_STR_SIZE] - p);
if (len > size) {
return NULL; // Not enough room
}
return memcpy(dest, p, len);
}
使用C99或更高版本,代码可以使用复合文字处理缓冲区创建,从而为每个mt_itoa()
调用提供单独的缓冲区。
// compound literal C99 or later
#define MY_ITOA(x) my_itoa((char [INT_STR_SIZE]){""}, INT_STR_SIZE, x)
int main(void) {
printf("%s %s %s %s\n", MY_ITOA(INT_MIN), MY_ITOA(-1), MY_ITOA(0), MY_ITOA(INT_MAX));
return (0);
}
输出
-2147483648 -1 0 2147483647
答案 1 :(得分:-2)
从整数转换为char *使用函数itoa()。 / * itoa例子* /
#include <stdio.h>
#include <stdlib.h>
int main ()
{
int i;
char buffer [33];
printf ("Enter a number: ");
scanf ("%d",&i);
itoa (i,buffer,10);
printf ("decimal: %s\n",buffer);
itoa (i,buffer,16);
printf ("hexadecimal: %s\n",buffer);
itoa (i,buffer,2);
printf ("binary: %s\n",buffer);
return 0;
}
答案 2 :(得分:-4)
所以,我做了一个创造这项工作的职能
编辑:有泄漏,功能有点脏,我同意......
创建一个文件my_int_char.c
,其中包含以下内容:
#include <stdlib.h>
char *my_int_char(int nbr)
{
char *tab = malloc(sizeof(char) * 16);
int count = 0, div=1, neg = 0, c = 0, tmp_div = 1;
if (nbr < 0)
{
nbr *= -1;
neg = 1;
}
while (nbr / tmp_div >= 1)
{
tmp_div *= 10;
c++;
}
while (c >= count && (c - (count + 1)) >= 0)
{
tab[c - (count + 1)] = nbr / div % 10 + 48;
div *= 10;
++count;
}
if (neg)
{
while (c >= 0)
{
tab[c + 1] = tab[c];
c--;
}
tab[0] = '-';
}
return (tab);
}
你有它!现在在main中测试你的函数;
main()
{
printf("%s\n", my_int_char(-42));
printf("%s\n", my_int_char(42));
printf("%s\n", my_int_char(42021));
return (0);
}