繁体   English   中英

将 integer 存储在 char 数组中

[英]Store an integer in a char array

我正在尝试将 integer 存储在char数组中。 我怎样才能做到这一点? 这是我的方法(通过将int转换为char ),但它不起作用。 我错过了什么?

#include <stdio.h>

int main(int argc, char** argv) 
{
    char cArray[10] = {};

    // Store a character in the char array
    cArray[5] = 'c';
    printf("%c\n", cArray[5]);

    // Store an integer in the char array
    cArray[6] = (char) 0; // WHY DOES THIS NOT WORK???
    printf("%c\n", cArray[6]);
}

让我们从基础开始。

对于x86体系结构(假设使用它), char变量存储在1个字节中,而int变量存储在4个字节中。

除非您具有某种压缩模式,并且知道程序中不会出现某些整数值(无随机数!),否则将random整数值存储在char变量中是不可能的。 没有例外。

在您的情况下,您想将整数存储在char数组中。 有四个选项:

1.如果要在此char数组中存储一个随机整数,则应获取指向要存储该整数的索引的指针,并将其转换为整数指针,然后像这样使用它。

char mychars[10];
int * intlocation = (int*)(&mychar[5]);
*intlocation = 3632; // stores 3632

请注意,这将从指定的索引开始写入4个字节(数组中的4个char位置)。 您应该始终检查自己是否不会超出数组范围,并且还应该执行相同的强制转换以在需要时检索值。

2.如果您的值介于[0,255]或[-128,127]之间,则可以安全地将整数存储在char中,因为这些范围可以使用字节表示。 请注意,对char进行签名或未签名是依赖于实现的。 看一下这个!

mychars[5] = 54;

3.如果您的整数只是一个数字,则可以使用数字的char表示形式。

mychars[5] = your_digit + 48; // 48 is the ascii code for '0'

4.如果要存储整数的字符串表示形式,则应使用itoa()并将结果字符串的每个字符逐一写入数组。 在这种情况下,您应该始终检查是否不会超出阵列。

cArray[6] = (char) 0; // WHY DOES THIS NOT WORK???
printf("%c\n", cArray[6]);

此代码尝试打印编码为0字符 假设使用ASCII,则不会显示任何内容,因为没有与该代码关联的可打印字符。

如果打算存储字符 '0'的ASCII码并打印,则需要编写

cArray[6] = 48;               // same as writing cArray[6] = '0' (ASCII)
printf( "%c\n", cArray[6] );

这会将0打印到您的控制台。

如果,另一方面,要存储的任何任意整数值1cArray[6]并显示该值 ,则需要使用%d转换说明:

cArray[6];
printf( "%d\n", cArray[6] );


1.也就是说,无论如何,任何适合char范围的整数

通常,一台计算机完全按照您所说的去做。 指令DWIM (按我的意思做)还没有被发明出来。

cArray[6] = (char) 0; // WHY DOES THIS NOT WORK???

设置索引位置6,但是

printf("%c\n", cArray[5]);

打印索引位置5。

我想补充一下 Seçkin Savaşçı 的答案(其中您将char*指向char数组中某处的指针转换为int*指针,从而允许您通过取消引用指针将 integer 写入数组)。

您还可以使用位移:

#include <stdio.h>

int main() {

    int first_int = 4892; // number larger than 127 (max. value of char)
    int second_int = 99584; // same
    
    // char array to hold two integers:
    char array[8]; // ...assuming an integer size of 4 and char size of 1

    // Now, assuming you are on a little endian system (in which the least
    // significant bytes come first), you can add the two above integers to the
    // array like so:

    array[0] = first_int; // assigns first_int's least significant byte
    array[1] = first_int >> 8; // assigns first_int's 2nd least significant byte
    array[2] = first_int >> 16; // assigns first_int's 2nd most significant byte
    array[3] = first_int >> 24; // assigns first_int's most significant byte

    // repeat for second_int:

    array[4] = second_int;
    array[5] = second_int >> 8;
    array[6] = second_int >> 16;
    array[7] = second_int >> 24;

    // You can now prove that this char array holds the two integers like this:

    printf("First integer: %d\n", *((int *) array));
    printf("Second integer: %d\n", *((int *) (array + 4)));

    return 0;
}

在大端系统上,您将首先分配最高有效字节,然后再分配最低有效字节。

更换

cArray[6] = (char) 0; // WHY DOES THIS NOT WORK???
printf("%c\n", cArray[5]);

通过

cArray[6] = (char)51;
printf("%c\n", cArray[6]);

应显示“ 3”

我认为您会理解您的错误... 0 int并不表示可打印字符'0',而是NULL终止字符串

51 int表示字符“ 3”

您可以使用itoa(0,&cArry[6],10)

使用正确所需的格式说明符。

cArray[6] = (char) 0; 确实将整数0存储到数组元素cArray[6] 它的printf()欺骗了OP使其认为不起作用。

使用%c表示OP希望使用0编码的字符。(通常不可见)。 使用%d打印cArray[6]的整数值。

printf("%d\n", cArray[6]);

您可以将ASCII值0添加到要将数字存储到字符数组中的值。 例如,如果要将0,1,...,9存储到字符数组A [10]中,则可以使用以下代码。

     for(j = 0; j<k; j++)
     {
          A[j] = j + '0';  // Same effect if you use A[j] = j + 0x30
     }

仅当您要存储的整数小于10时,此方法才有效。否则,您将必须使用模运算符并存储来提取数字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM