我遇到了一个奇怪的问题,我有一个字符串,它显示所有字符和数字,没有任何问题。但是对于整数数组,同样的事情是不可能的。据我所知,字符串是一个NULL
终止的字符数组。那么,是什么让字符串与众不同,可以毫无歧视地显示所有内容。
任何帮助表示赞赏。谢谢!
您指示编译器打印它们的方式使它们不同。
当你写
printf("%s", charPtr);
你告诉编译器它应该被charPtr
视为一个NULL
- 终止的字符串。它查看内存charPtr
指向并将每个字节解释为一个字符,直到它到达一个0
.
泛型数组类型没有等价物。
像这样?:
#include <stdio.h>
int main(void)
{
int a =1;
int array[] = {1,2,3};
const char c = 'a';
char str[] = "hello";
const char char_a[] ={119,111,114,108,100,0}; //ascii codes for world
printf("this is a int: %d\n",a);
printf("this is a int array: %d, prints only the first element of array\n",*array);
printf("this is a int array: %d, prints only the 2. element of array\n",array[1]);
printf("this is a char: %c\n",c);
printf("this is a char array: %c, print only first element of str\n",*str);
printf("this is a char array: %s, prints to \\0 \n",str);
printf("this is a char array(made from numbers): %s, prints to 0 \n",char_a);
return 0;
}
选项 %s 告诉 printf,它应该将数组中的元素视为字符,并且它应该打印它直到它达到 \0。
/* 问题的答案在底部。一句话,呵呵。*/
由于一个 char 字符串是用一个NULL
aka0
值分隔的,printf
所以只要遇到一个 char 就会停止。现在假设我们有两个数组,一个char
和一个int
,如下所示:
char char_array[] = { 'a', 'b', 'c', '\0' };
int int_array[] = { 'a', 'b', 'c', '\0' };
现在,如果我们要尝试打印那些:
printf("char array: %s\n", char_array);
printf("int array: %s\n", (char*) int_array);
我们会得到这个输出:
char array: abc
int array: a
即使我们不将 int_array 强制转换为char*
,它仍然会执行相同的操作(不过编译器可能会抱怨)。但为什么会这样?让我们检查保存这两个数组的内存。(在 little-endian 上)char_array 持有:0x00636261
而 int_array 持有(每 32 位分隔):0x00000061 0x00000062 0x00000063 0x00000000
所以,发生的事情是 -printf
读取一个字符串 one char
,换句话说,一次读取一个字节。因此,在读取 int_array 时,它会读取第一个字节,即0x61
(字符 'a'),然后跳转到下一个字节。但是哎呀!下一个字节0x00
(0x0000 00 61)!这标志着字符串的结束并停止。
现在,让我们将 int_array 中的值设置为:
int int_array[] = { 0x61616161, 0x62626262, 0x63636363, '\0' };
现在可以打印了int array: aaaabbbbcccc
!
由于值中不再有任何0x00
间隙,因此printf
只需打印直到它达到我们初始化为零的第四个 int。
也就是说,如果想打印一个 int 数组,因为它是一个字符串,要么必须编写一个函数/包装器来构建一个 char 字符串,该字符串只保存每个 int 的第一个字节的值,或者构建一个字符串所有的0x00
值都消失了。
所以,回答你的问题“是什么让它们与众不同”:因为这是 C,所以所有这些都只是一堆位,也就是普通的旧数据。所以唯一的区别是我们如何对待它。有了这个,我打赌你,如果char_array
连续分配并对齐,如果你使用char_array
as a *((int*) char_array)
, on little endian,它会给你一个值6513249
( 0x00636261
) =]