2017-09-26 366 views
0

我试图将整数转换为char *指针,以便我可以正确地将参数发送到另一个函数。无论如何没有atoi做到这一点?INT转换为char *指针

int number=2123, number2= 1233; 
char* arg[]; 

arg[0] = number; 
arg[1] = number2; 

**对不起,不使事情明确所以基本上我希望ARG [0]为等于数字的字符串代表,这样我可以发送它到这样的功能:转换(字符* ARG );

我想改变参数的数据类型,但它必须是指针发送。

+0

所以,你希望arg []中的参数是数字的字符串表示,就像上面的“2123”和“1233”一样? – Joe

+0

你很困惑。你真的想把数字转换成它的字符表示(在这种情况下,你需要像sprintf())?或者,你的函数使用char *知道如何处理整数的地址?此外,您需要为arg [],arg [0]和arg [1]分配内存。 –

+1

为什么你不能首先使用'atoi'? – myaut

回答

0

如果假定一个指针总是至少同样大小的整数(是否有任何例外?),你可以放心地将整数的指针和回用以下宏:

#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(),以便安全),但是需要首先计算字符串长度。

0

整数转换为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> 
+0

*请*称它'itoa'! –

+0

@SteveSummit .ekatsim a saw tahT。代码修改。 – chux

-2

下面是函数你“重新寻找:

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); 
} 
+0

'while(nb> 0)'是否定'int'和'0'的问题。 – chux

+0

该函数分配堆内存来保存结果字符串。这不一定是坏事,但它需要记录,以便调用者可以释放内存并避免内存泄漏。 –

+0

是的,它已更新,它适用于我:) – YaatSuka