为什么 chararray
必须以空字符结尾?有什么理由我必须将空字符添加到每个char
数组?
似乎他们得到了同样的待遇。
char 数组不必以 null 结尾(不依赖于此的标准库函数包括memcpy
, memmove
, strncpy
-- 错误地命名为最新的 --printf
具有正确的格式字符串)。
根据定义,NUL 终止字符串 (NTCS) 需要由 NUL 终止。它是 C 标准库的字符串处理实用程序所期望的格式,也是大多数 C 程序使用的约定(在 C++ 中,通常使用std::string
)
在 C 中,如果您有一个指向数组的指针,那么就无法确定该数组的长度。正如@AProgrammer 所指出的那样,设计人员本可以将其保留在那里并迫使程序员跟踪所有字符数组的长度。但是,这会使 C 中的文本处理变得比现在更加困难。
因此,语言设计者确定了一个约定,允许通过指示字符串结尾的空字符的存在来推断字符串长度。
例如,考虑strcpy
:
char *strcpy(char *destination, const char *source);
在 C 中没有办法确定指针destination
和source
指向的数组的长度。因此,如果不存在指示字符串结尾的标记值,则唯一的其他解决方案是传递指示source
字符串长度的额外参数。
当然,鉴于现代安全考虑,已经引入了接收缓冲区长度参数的字符串处理函数。但是在发明空终止字符串时,计算环境看起来非常不同。
仅当您想将其用作字符串时。然后所有 C/C++ 字符串函数将在最后搜索空字符,如果它不存在,它们将继续搜索,迟早你的应用程序会崩溃。
如果您只打算将数组字符用作字符数组,而不是将它们称为字符串,那么没问题。它就像一个整数数组。
一般来说,没有理由这样做,但您必须知道,根据定义,每个字符串都是一个char
带有空终止符的数组。如果您的char
数组表示一个字符串,那么如果您省略空终止符,则每个使用 C 字符串的函数都不会返回正确的值,或者行为与预期不同。
但是char
是int
, float
or之类的类型double
,因此您可以随意创建char
数组,而不需要它们以空值结尾。