簡體   English   中英

在 C 中將 int 轉換為 char 數組

[英]Cast int to char array in C

是否可以僅使用強制轉換在 C 中將 int 轉換為“字符串”? 沒有像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;
}

當然這是不可能的,因為數組是一個對象並且需要storage 轉換結果是,而不是對象 有人會說 C 的全部意義/力量在於您可以控制對象的存儲和生命周期。

生成包含整數的十進制表示的字符串的正確方法是自己為它創建存儲並使用snprintf

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

您必須將500轉換為"500"

"500"'5' then '0' then '0' then 0 最后一個元素0是字符串的空終止符。

500等於5 * 100 + 0 * 10 + 0 * 1 你必須在這里做一些數學運算。 基本上你必須使用/操作符。

那么這也可能有用: '5''0' + 5

在不給出確切編碼答案的情況下,您要做的是遍歷整數的每個數字(通過 % 運算符計算其余數模 10),然后將其值添加到 ASCII 值“0”,將結果轉換回字符,並將結果放入以空字符結尾的字符串中。

一個假裝不存在隱式強制轉換的示例可能如下所示:

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

您可以通過計算數字的對數以 10 為底來確定結果字符串的長度,或者在使用 realloc() 時簡單地動態分配它。

由於字節順序,強制轉換是一種可怕的方法,但無論如何這里有一個例子 - 在某些情況下它很有用(不過,由於編譯器處理這些類型的強制轉換,現在聯合工作得更好)。

#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 的末尾進入無人區(在小型測試程序中,它通常是環境變量)……無論如何,更多可移植性,您可以使用網絡字節順序(對於小端是無操作的):

#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 上,它們將被優化掉,因此您不妨將它們用於便攜性。

僅僅因為它還沒有列出:這是一種使用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 );

獲取分區數然后一一添加到您的緩沖區中

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

更緊湊:

char *lotaa(long long nb) {
    int size = (nb ? floor(log10(llabs(nb))) : 0) + (nb >= 0 ? 1 : 2);
    char *str = malloc(size + 1);

    str[0] = '-';
    str[size] = 0;
    for(nb = llabs(nb); nb > 0 || (size > 0 && str[1] == 0); nb /= 10)
        str[--size] = '0' + nb % 10;
    return (str);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM