【问题标题】:if the maximum capacity of character is 256 how to store character array of 1000?如果字符的最大容量为 256,如何存储 1000 个字符数组?
【发布时间】:2017-09-24 13:13:32
【问题描述】:

如果字符的最大容量是256,如何存储1000个字符数组? 是否可以声明: 字符s[1000];

【问题讨论】:

  • 是的,可以声明char s[1000];
  • “最大容量”是什么意思?
  • 一个典型的 char 可能有 256 个值中的 1 个。 array 中元素的数量可以是[1...SIZE_MAX).
  • @tarun Gupta 您可能对限制应用程序架构师和内存存储之间存在混淆:当您创建静态数组时,将存储在 PE .data/ .rdata /.bss 部分的堆栈中你的二进制文件。使用 new、malloc ... 时的动态数组将直接在堆上分配。
  • 单个字符中可以存储的值的数量与字符数组的大小无关。 C 并不是使用字符串的第一个字节来存储字符串的长度。 (某些语言,例如 Pascal,在某些实现中确实使用了这种技巧。)

标签: c character


【解决方案1】:

是的,这当然是可能的。

char s[1000];

您可以将 1000 视为数组的“长度”,将 256 视为“宽度”。你会得到一个包含 1000 个 chars 的数组。每个 char 是 8 位(至少在您使用的机器上),因此可以存储 256 个不同的值。 (实际上,将“宽度”视为 8 而不是 256 可能更合适。)

这是您的数组,每个框代表一个char

   +---+---+---+---+---+---+---+---+-   -+---+
s: |   |   |   |   |   |   |   |   | ... |   |
   +---+---+---+---+---+---+---+---+-   -+---+
     0   1   2   3   4   5   6   7        999

或者这里显示的是各个位:

   +---+---+---+---+---+---+---+---+-   -+---+
s: |   |   |   |   |   |   |   |   |     |   | 7
   +---+---+---+---+---+---+---+---+-   -+---+
   |   |   |   |   |   |   |   |   |     |   | 6
   +---+---+---+---+---+---+---+---+-   -+---+
   |   |   |   |   |   |   |   |   |     |   | 5
   +---+---+---+---+---+---+---+---+-   -+---+
   |   |   |   |   |   |   |   |   |     |   | 4
   +---+---+---+---+---+---+---+---+-   -+---+    bit
   |   |   |   |   |   |   |   |   | ... |   | 3  number
   +---+---+---+---+---+---+---+---+-   -+---+
   |   |   |   |   |   |   |   |   |     |   | 2
   +---+---+---+---+---+---+---+---+-   -+---+
   |   |   |   |   |   |   |   |   |     |   | 1
   +---+---+---+---+---+---+---+---+-   -+---+
   |   |   |   |   |   |   |   |   |     |   | 0
   +---+---+---+---+---+---+---+---+-   -+---+
     0   1   2   3   4   5   6   7        999
                array index

假设我们通过调用strcpy 将一个字符串放入数组中:

strcpy(s, "Hello!");

或者我在声明它时初始化它:

char s[1000] = "Hello!";

按字节看是这样的:

   +---+---+---+---+---+---+---+---+-   -+---+
s: | H | e | l | l | o | ! |\0 |   | ... |   |
   +---+---+---+---+---+---+---+---+-   -+---+
     0   1   2   3   4   5   6   7        999

或者按位看起来是这样的:

   +---+---+---+---+---+---+---+---+-   -+---+
s: | 0 | 0 | 0 | 0 | 0 | 0 | 0 |   |     |   | 7
   +---+---+---+---+---+---+---+---+-   -+---+
   | 1 | 1 | 1 | 1 | 1 | 0 | 0 |   |     |   | 6
   +---+---+---+---+---+---+---+---+-   -+---+
   | 0 | 1 | 1 | 1 | 1 | 1 | 0 |   |     |   | 5
   +---+---+---+---+---+---+---+---+-   -+---+
   | 0 | 0 | 0 | 0 | 0 | 0 | 0 |   |     |   | 4
   +---+---+---+---+---+---+---+---+-   -+---+    bit
   | 1 | 0 | 1 | 1 | 1 | 0 | 0 |   | ... |   | 3  number
   +---+---+---+---+---+---+---+---+-   -+---+
   | 0 | 1 | 1 | 1 | 1 | 0 | 0 |   |     |   | 2
   +---+---+---+---+---+---+---+---+-   -+---+
   | 0 | 0 | 0 | 0 | 1 | 0 | 0 |   |     |   | 1
   +---+---+---+---+---+---+---+---+-   -+---+
   | 0 | 1 | 0 | 0 | 1 | 1 | 0 |   |     |   | 0
   +---+---+---+---+---+---+---+---+-   -+---+
     0   1   2   3   4   5   6   7        999
                array index

数组中还有993个空格。

[附注对挑剔者:是的,那些是 ASCII 代码,不,C 标准没有指定字符编码。但我认为我们可以放心地假设这些是提问者会看到的代码。]

【讨论】:

  • 吹毛求疵:您如何确定 OP 使用的是 ASCII 而不是例如UTF-8 ?我猜——从他的名字或假名来看——他可能不是美国人,所以(比美国公民)更有可能使用 UTF-8 而不是过时的 ASCII。见utf8everywhere.org;在 2017 年 ASCII 不是很常见,大多数计算机都使用 UTF-8
  • @BasileStarynkevitch 当我写到我担心的是 EBCDIC nitpickers,而不是 UTF-8 nitpickers。当然,我选择的示例字符串的编码在 ASCII 和 UTF-8 中是相同的。但我想我必须改正最后一句话……完成。
【解决方案2】:

256 是单个 char 中值的数量(通常是 8 位字节,256 = 28)。

(注意,C11 标准允许更宽的 char-s,例如 32 位;但这非常罕见

字符串是包含多个char-s 的数组或内存区域,通常以零字节结束。

你可以有非常大的字符串,特别是使用C dynamic memory allocation。例如,在 一些 计算机上

 char*hugestring = malloc(1000000000);

可以成功。然后你可以填充那个十亿字节的字符串。在许多计算机上,malloc 调用会失败,您总是需要检查malloc 的结果,至少按照上面的一行

if (!hugestring) { perror("malloc hugestring"); exit(EXIT_FAILURE); };

如果您使用malloc,请不要忘记稍后致电free(您需要有关于谁负责的约定);否则你有一个memory leak。顺便说一句,asprintfstrdupopen_memstream 函数非常有用(但并非随处可用)以方便地构建动态分配的字符串(它们在内部使用 malloc)。 valgrind 之类的工具有助于检测内存泄漏。

你也可以有数组。如果它们是local variables(又名automatic variables),它们通常位于call stack(除非编译器针对它们进行了优化)。

例如,使用snprintf 安全地填充本地缓冲区(不使用buffer overflow),

char buffer[100];
snprintf(buffer, sizeof(buffer), "x=%d, name=%s", x, name);

但是有大的调用帧是不合理的,所以本地数组通常应该小于几百字节(或者可能是几千字节)。整个调用堆栈通常限制为一兆或几兆字节。详细信息因系统而异。

注意character encoding 问题。在 2017 年至少阅读 utf8everywhere.org 和大约 Unicode.... 所以将 char 视为一个字节(因为某些 UTF-8 字符需要 几个 字节,所以取 几个 char-s 要表示,因此在我的 Linux 桌面上,strlen("être") 是 5,sizeof("être") 是 6,因为强调的 ê 字母是 UTF-8 编码的两个字节)。您可能会使用一些库,例如 libunistring

还可以查看一些C reference

【讨论】:

    【解决方案3】:

    您似乎误解了您所说的char 的“容量”。 char 是一个 8 位值,这意味着它的范围可以从 0000 0000b ()1111 1111b (255)

    这仅指一个单独的值。这意味着你可以写char c = 20;,但不能写char c = 1000;

    因此,这意味着单个 char 有 256 个不同的可能值。


    数组是一个不同的概念:数组存储一种特定类型的多个值 - 例如字符数组。

    回答您的问题:是的,您可以将 1000 个 char 值存储在一个数组中,例如 Steve Summit 建议的 char s[1000]

    当然,如果您有 1000 个字符,这意味着会有重复(因为可能只有 256 个唯一字符)。

    【讨论】:

      猜你喜欢
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多