如果字符的最大容量是256,如何存储1000的字符数组?

时间:2017-09-24 13:13:33

标签: c character

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

3 个答案:

答案 0 :(得分:3)

是的,这当然是可能的。

char s[1000];

您可以将1000视为数组的“长度”,将256视为“宽度”。你得到一个1000 char的数组。每个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个空格。

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

答案 1 :(得分:2)

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

(请注意,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。 BTW asprintfstrdupopen_memstream函数非常有用(但并不是随处可用),以方便地构建动态分配的字符串(内部malloc由它们使用)。像valgrind这样的工具有助于帮助检测内存泄漏。

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

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

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

但是拥有大的调用帧是不合理的,因此本地数组通常应该少于几百个字节(或者可能是几千个字节)。整个调用堆栈通常限制为一个或几兆字节。细节是系统特定的。

了解character encoding问题。 2017年至少阅读utf8everywhere.orgUnicode ....所以请将char视为一个字节(因为某些UTF-8字符需要几个字节,所以需要表示几个 char - s,因此在我的Linux桌面上strlen("être")为5,sizeof("être")为6,因为强调{{1} }字母是两个字节的UTF-8编码)。您可以使用像libunistring这样的库。

还要看一些C reference

答案 2 :(得分:0)

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

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

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

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

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

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