C 如果字符的最大容量为256,如何存储1000个字符数组?
如果字符的最大容量为256,如何存储1000个字符数组? 是否可以宣布:C 如果字符的最大容量为256,如何存储1000个字符数组?,c,character,C,Character,如果字符的最大容量为256,如何存储1000个字符数组? 是否可以宣布: chars[1000] 是的,这当然是可能的 char s[1000]; 您可以将1000视为数组的“长度”,256视为“宽度”。您将得到一个1000个字符的数组。每个char是8位(至少在您使用的机器上),因此可以存储256个不同的值。(实际上,将“宽度”视为8而不是256可能更合适。) 这是您的数组,每个框代表一个char: +---+---+---+---+---+---+---+---+- -+---+
chars[1000] 是的,这当然是可能的
char s[1000];
您可以将1000视为数组的“长度”,256视为“宽度”。您将得到一个1000个字符的数组。每个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
或者说,它看起来是这样的:
+---+---+---+---+---+---+---+---+- -+---+
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.对挑剔的人说:是的,这些是ASCII码,不,字符编码不是C标准规定的。但我认为我们可以放心地假设提问者会看到这些代码。]256是单个
char
中的值数(通常是8位字节,256=28)
(注意,C11标准允许更宽的char
-s,例如32位;但这种情况非常少见)
字符串是一个数组或内存区域,包含多个字符
-s,通常以零字节结尾
您可以有非常大的字符串,特别是使用。例如,在一些计算机上
char*hugestring = malloc(1000000000);
你可以成功。然后你就可以填充十亿字节的字符串了。在许多计算机上,malloc
调用将失败,您始终需要检查malloc
的结果,至少要按照上面的命令执行
if (!hugestring) { perror("malloc hugestring"); exit(EXIT_FAILURE); };
如果你使用了,别忘了以后再打电话(你需要约定谁负责);否则,你会有一个错误。顺便说一句,和函数非常有用(但不是到处都可用),可以方便地构建动态分配的字符串(它们使用内部malloc
)。像这样的工具有助于检测内存泄漏
也可以有数组。如果它们是(也称为)它们通常位于(除非编译器针对它们进行了优化)
例如,使用安全地填充本地缓冲区(无)
但是拥有大的调用帧是不合理的,因此本地数组通常应该少于几百字节(或者几千字节)。整个调用堆栈通常限制在一个或几兆字节内。详细信息是特定于系统的
注意问题。2017年,至少阅读并了解。。。。所以把char
看作一个字节(因为有些字符需要几个字节,所以用几个char
-s来表示,因此在我的Linux桌面上strlen(“être”)
是5,而sizeof(“être”)
是6,因为重音的字母是用两个字节编码的UTF-8)。你可以用一些像这样的图书馆
你似乎误解了你所说的字符的“容量”char
是一个8位的值,这意味着它可以在0000 0000b()
到1111111b(255)
的任何范围内
这仅指一个单独的值。这意味着您可以编写charc=20代码>,但不是字符c=1000代码>
因此,这意味着单个char
有256个不同的可能值
数组是一个不同的概念:数组存储一种特定类型的多个值,例如字符数组
回答您的问题:是的,您可以在数组中存储1000个char
值,如Steve Summit建议的chars[1000]
当然,如果您有1000个字符,这意味着将有重复的字符(因为可能只有256个唯一字符)。是的,可以声明字符[1000]代码>。您所说的“最大容量”是什么意思?典型的char
可能有256个值中的1个。数组中的元素数可以是[1…SIZE_MAX)
@tarun Gupta您可能会混淆limit app architect和内存存储:当您创建静态数组时,将存储在二进制文件的PE.data/.rdata/.bss部分的堆栈上。使用新的malloc…时,将直接在堆上分配动态数组。可以n存储在单个字符中与字符数组的大小无关。这不像C使用字符串的第一个字节来存储字符串的长度。(某些语言,如Pascal,在某些实现中确实使用这种技巧。)吹毛求疵:你怎么能确定OP使用的是ASCII而不是UTF-8?我猜——从他的名字或伪名字来看——他可能不是美国人,所以更有可能(比美国公民)使用UTF-8而不是过时的ASCII。参见;在2017年,ASCII不是很常见,大多数计算机都使用UTF-8@BasileStarynkevitch当我写这篇文章时,我担心的是EBCDIC挑剔者,而不是UTF-8挑剔者。当然,我选择的示例字符串的编码在ASCII和UTF-8中都是相同的。但我想我必须解决这个问题最后一句…完成了。