2013-05-07 93 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);