![](/img/trans.png)
[英]Converting/typecasting Int pointer to char pointer, but getting ascii characters?
[英]Converting Int to a char* pointer
我正在尝试将整数转换为char *指针,以便可以将参数正确发送到另一个函数中。 反正没有atoi可以做到这一点吗?
int number=2123, number2= 1233;
char* arg[];
arg[0] = number;
arg[1] = number2;
**对不起,我基本上不希望让事情变得清楚,我希望arg [0]等于数字的字符串rep,以便我可以将其发送到这样的函数中:converted(char * arg);
我会更改参数数据类型,但必须是要发送的指针。
将整数转换为
char*
指针,以便我可以正确地将参数发送到另一个函数中。
通过使用带有复合文字的char
数组调用char
函数来转换数字,从而创建数字的字符串表示形式。 该字符串将对该函数有效,并在代码块的末尾有效。 字符串的适当大小很重要-将其留给另一个练习。 这里的代码使用41,足以用于128位int
。 对于这么小的缓冲区,不需要通过malloc()/free()
进行内存管理。
char *my_itoa(char *dest, int i) {
sprintf(dest, "%d", i);
return dest;
}
#define ITOA(n) my_itoa((char [41]) { 0 }, (n) )
int main(void) {
int number=2123, number2= 1233;
printf("<%s> <%s>\n", ITOA(number), ITOA(number2));
printf("<%s> <%s> <%s>\n", ITOA(INT_MIN), ITOA(0), ITOA(INT_MAX));
}
输出量
<2123> <1233>
<-2147483648> <0> <2147483647>
如果您假设指针的大小始终至少与整数相同(是否有例外情况?),您可以安全地将整数转换为指针,并使用以下宏将其返回:
#define INT2POINTER(a) ((char*)(intptr_t)(a))
#define POINTER2INT(a) ((int)(intptr_t)(a))
或者,如果该其他函数不是您的函数,而是想要将整数作为字符串的函数,则可以这样使用asprintf():
asprintf(&arg[0],"%d",number);
asprintf(&arg[1],"%d",number2);
但是asprintf不是posix标准,因此可能并非在所有系统上都可用。 您可以改用sprintf()(或snprintf()以便安全起见),但是随后您需要首先计算字符串长度。
这是您要寻找的功能:
char *int_to_char(int nb)
{
int div;
char *str;
int i;
int size;
int sign;
i = -1;
sign = 1;
size = get_int_lenght(nb);
if (!(str = malloc(sizeof(char) * (size + 1))))
return (NULL);
if (nb < 0)
{
sign *= -1;
nb *= -1;
}
if (nb == 0)
{
str[++i] = '0';
str[i + 1] = 0;
return (str);
}
while (nb > 0)
{
str[++i] = (nb % 10) + '0';
nb /= 10;
}
if (sign < 0)
str[++i] = '-';
str[i + 1] = 0;
return (my_revstr(str));
}
具有revstr功能:
char *my_revstr(char *str)
{
int i;
int j;
char tmp;
i = -1;
j = strlen(str);
while (++i < j)
{
tmp = str[i];
str[i] = str[--j];
str[j] = tmp;
}
return (str);
}
和get_int_lenght函数:
int get_int_lenght(int nb)
{
int size;
size = 0;
if (nb <= 0)
{
size++;
nb *= -1;
}
while (nb > 0)
{
size++;
nb /= 10;
}
return (size);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.