将int转换为C中的char数组

时间:2013-05-07 22:36:04

标签: c arrays casting char int

是否可以使用强制转换将C中的int转换为“string”?没有任何功能,例如atoi()sprintf()

我想要的是这样的:

int main(int argc, char *argv[]) {
    int i = 500;
    char c[4];

    c = (char)i;
    i = 0;
    i = (int)c;
}

原因是我需要生成两个随机整数(0到500)并将两个作为消息队列中的一个字符串发送到另一个进程。另一个进程接收消息并执行LCM。

我知道如何处理atoi()itoa()。但我的老师想要使用演员。

另外,为什么不能编译以下内容?

typedef struct
{
    int x;
    int y;
} int_t;

typedef struct
{
    char x[sizeof(int)];
    char y[sizeof(int)];
} char_t;

int main(int argc, char *argv[])
{
    int_t rand_int;
    char_t rand_char;

    rand_int.x = (rand() % 501);
    rand_int.y = (rand() % 501);

    rand_char = (char_t)rand_int;
}

6 个答案:

答案 0 :(得分:11)

当然不可能,因为数组是一个对象,需要存储。强制转换会产生,而非对象。有人会说C的全部意义/权力是你可以控制对象的存储和生命周期。

生成包含整数十进制表示的字符串的正确方法是自己为其创建存储并使用snprintf

char buf[sizeof(int)*3+2];
snprintf(buf, sizeof buf, "%d", n);

答案 1 :(得分:4)

您必须将500转换为"500"

"500"'5'相同,然后是'0',然后是'0',然后是0。最后一个元素0是字符串的空终止符。

500等于5 * 100 + 0 * 10 + 0 * 1。你必须在这里做一些数学。基本上你必须使用/运算符。

然后这也很有用:'5''0' + 5相同。

答案 2 :(得分:2)

在不给出确切的编码答案的情况下,您要做的是遍历整数的每个数字(通过%运算符计算其余数模10),然后将其值添加到ASCII值' 0',将结果转换回char,并将结果放在以null结尾的字符串中。

不存在像隐式强制转换那样假装的示例可能如下所示:

char c = (char) ( ((int) '0') + 5 ); // c should now be '5'.

您可以通过计算数字的日志基数10来确定结果字符串的长度,或者通过简单地使用realloc()来动态分配它。

答案 3 :(得分:2)

由于字节序,转换是一种可怕的方式,但无论如何这里都是一个例子 - 在某些情况下它很有用(尽管由于编译器处理这些类型的转换,工会现在工作得更好)。 / p>

#include <stdio.h> //for printf 
#define INT(x) ((int*)(x)) //these are not endian-safe methods
#define CHAR(x) ((char*)(x))
int main(void)
{
    int *x=INT(&"HI !");
    printf("%X\n",*x); //look up the ascii and note the order
    printf("%s\n",CHAR(x));
    return 0;
}

对于值<500的int,如果最重要的字节首先出现,则得到&#34;&#34;字符串&#34; (指向char数组的指针)&# 34;&#34; (或{0})但如果endianness是LSB优先(x86是小端)那么你将得到一个可用的3字节&#34;字符串&#34; char *(不一定是人类可读的字符) )但是不能保证整数中会有一个零字节,因为你所拥有的只是一个指向存储int的地址的指针,如果你要在它上面运行普通的字符串函数,它们就会超过结束原始int到无人区(在小测试程序中它通常是环境变量)...无论如何为了更多的可移植性,你可以使用网络字节顺序(对于小端是一个无操作):

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

这些函数只需字节换算即可获得网络字节顺序。在x86上,它们将被优化掉,因此您可以使用它们来实现可移植性。

答案 4 :(得分:1)

仅仅因为它尚未列出:这里有一种方法可以使用snprintf将int转换为具有可变大小分配的char数组:

int value = 5

// this will just output the length which is to expect
int length = snprintf( NULL, 0, "%d", value );

char* valueAsString = malloc( length + 1 );// one more for 0-terminator
snprintf( valueAsString, length + 1, "%d", value );

答案 5 :(得分:0)

获取除数,然后一一加到缓冲区

char *int2str(int nb) {
    int i = 0;
    int div = 1;
    int cmp = nb;
    char *nbr = malloc(sizeof(char) * 12);

    if (!nbr)
        return (NULL);
    if (nb < 0)
        nbr[i++] = '-';
    while ((cmp /= 10) != 0)
        div = div * 10;
    while (div > 0) {
        nbr[i++] = abs(nb / div) + 48;
        nb = nb % div;
        div /= 10;
    }
    nbr[i] = '\0';
    return (nbr);
}