如果字符的最大容量是256,如何存储1000的字符数组?
如果字符的最大容量是256,如何存储1000的字符数组 ? 是否可以声明:char s [1000];
是的,这当然是可能的。
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
剩下的arrays中有993个空格。
[PS to nitpickers:是的,那些是ASCII码,不,C标准没有指定字符编码。 但我认为我们可以放心地认为这些是提问者会看到的代码。
256是单个char
的值的数量(通常是8位字节,256 = 2 8 )。
(请注意,C11标准允许使用更宽的char
,例如32位;但这种情况非常罕见 )
字符串是包含多个char
的数组或内存区域,并且通常以零字节终止。
你可以拥有非常大的字符串,特别是使用C动态内存分配 。 例如,在某些计算机上
char*hugestring = malloc(1000000000);
可以成功。 然后你可以填充那个十亿字节的字符串。 在许多计算机上, malloc
调用将失败,并且您总是需要检查malloc
的结果,至少遵循以上行
if (!hugestring) { perror("malloc hugestring"); exit(EXIT_FAILURE); };
如果你使用malloc
,不要忘记以后free
打电话(你需要有关于谁负责的约定 ); 否则你有内存泄漏 。 顺便说一下, asprintf , strdup和open_memstream函数非常有用(但并不是随处可用),可以方便地构建动态分配的字符串(内部malloc
由它们使用)。 像valgrind这样的工具有助于帮助检测内存泄漏。
你也可以有arrays。 如果它们是局部变量 (也就是自动变量 ),它们通常位于调用堆栈中 (除非编译器针对它们进行了优化)。
例如,使用snprintf安全地填充本地缓冲区(没有缓冲区溢出 ),
char buffer[100]; snprintf(buffer, sizeof(buffer), "x=%d, name=%s", x, name);
但是拥有大的调用帧是不合理的,因此本地数组通常应少于几百个字节(或者可能是几千个字节)。 整个调用堆栈通常限制为一个或几兆字节。 细节是系统特定的。
注意字符编码问题。 在2017年至少读取utf8everywhere.org和关于Unicode ….所以将char
视为一个字节(因为一些UTF-8字符需要几个字节,所以需要表示几个 char
-s,因此在我的Linux桌面strlen("être")
是5, sizeof("être")
是6,因为加强的ê
字母是两个字节的UTF-8编码)。 您可以使用libunistring之类的库 。
另请参阅一些C参考 。
你似乎误解了你所说的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个唯一字符可能)。