如果字符的最大容量为256,如何存储1000的字符数组? 是否可以声明: char s [1000];
答案 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 asprintf,strdup和open_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.org和Unicode ....所以请将char
视为一个字节(因为某些UTF-8字符需要几个字节,所以需要表示几个 char
- s,因此在我的Linux桌面上strlen("être")
为5,sizeof("être")
为6,因为强调{{1} }字母是两个字节的UTF-8编码)。您可以使用像libunistring这样的库。
还要看一些C reference。
答案 2 :(得分:0)
你似乎误解了你所说的"容量"一个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个唯一字符)。