2013-05-07 94 views
9

只需使用转换就可以将int转换为C中的“string”?没有任何功能,如atoi()sprintf()将int转换为C中的char数组

我想要什么会是这样的:

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; 
} 
+9

关键的一句是“我的老师want'这意味着其后的内容是你弄清楚,不是为了让我们向你展示。 〜微笑〜 – 2013-05-07 22:37:27

+0

你无法想象我努力工作的努力,时间和研究的数量。一切工作正常,只是演员不工作。 – Bodosko 2013-05-07 22:40:58

+5

我会反驳说,你浪费了一秒钟的时间......你完全按照老师的意图去做了......你花了很多时间想出怎么不这样做。这对于程序员来说非常有价值。 – 2013-05-07 22:42:28

回答

4

您必须将500转换为"500"

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

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

然后这也可能是有用的:'5'是与'0' + 5相同。

+1

但这样我不会使用铸造。我可以想象许多方法来做我所需要的,但其中任何一种方法都涉及到投射,即使可能,我也不知道。 – Bodosko 2013-05-07 23:01:30

+1

您使用铸造的要求是不实际的。这就像告诉某人他们必须用计算器解决问题,而他们已经在脑海中解决了这个问题。只需解决它,而无需铸造。 (如果必须的话,粘上一个虚拟角色,就像在计算器中输入1 + 1 =一样。) – 2013-05-07 23:35:06

11

当然这是不可能的,因为阵列是一个对象,需要存储。演员结果,而不是对象。有人会说C的整点/功率是你有过对象的存储和寿命控制。

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

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

不放弃一个确切的答案编码,你会想做的是循环通过整数的每个数字(通过计算其剩余部分经由%运算模10),然后将其值增加的“0”的ASCII值,铸造结果回CHAR,置该结果在以null结尾的字符串。

它假装喜欢隐式转换不存在可能是这样一个例子:通过计算数的底数10

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

您可以确定结果字符串的长度,或通过简单地分配它动态地使用realloc()。

2

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

#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,如果最显著字节至上,则得到一个“串”的“”(指向字符数组)(或{0}),但如果字节序首先是LSB(x86是小端),那么您将得到一个可用的3字节“字符串” char *(不一定是人类可读的字符),但不能保证在整数中会有零字节并且因为你所拥有的只是一个指向存储int的地址的指针,如果你要在它上面运行正常的字符串函数,它们会经过原始int的末尾进入no-mans-land(在小测试程序中它将会通常是环境变量)...无论如何为了更多的便携性,你可以使用网络字节顺序(其小端是无操作):

#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上,它们将被优化,所以你不妨使用它们来实现可移植性。

0

只是因为它还未上市:这里的方式来转换INT使用snprintf烧焦可变大小分配数组:

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