[英]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
打印到您的控制台。
如果,另一方面,要存储的任何任意整数值1到cArray[6]
并显示该值 ,则需要使用%d
转换说明:
cArray[6];
printf( "%d\n", cArray[6] );
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.