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