0

我遇到了一个奇怪的问题,我有一个字符串,它显示所有字符和数字,没有任何问题。但是对于整数数组,同样的事情是不可能的。据我所知,字符串是一个NULL终止的字符数组。那么,是什么让字符串与众不同,可以毫无歧视地显示所有内容。

任何帮助表示赞赏。谢谢!

4

3 回答 3

1

您指示编译器打印它们的方式使它们不同。

当你写

printf("%s", charPtr);

你告诉编译器它应该被charPtr视为一个NULL- 终止的字符串。它查看内存charPtr指向并将每个字节解释为一个字符,直到它到达一个0.

泛型数组类型没有等价物。

于 2012-05-28T15:05:29.643 回答
1

像这样?:

#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。

于 2012-05-28T15:55:08.733 回答
1

/* 问题的答案在底部。一句话,呵呵。*/

由于一个 char 字符串是用一个NULLaka0值分隔的,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_arrayas a *((int*) char_array), on little endian,它会给你一个值6513249( 0x00636261) =]

于 2012-05-29T13:35:46.663 回答