1

我是 C++ 新手,我开始想知道,如果在定义 char 数组时将空字符排除在外,会发生什么情况?

例如,如果我用空字符定义一个 char 数组:

char myarray[] = {'a', 'b', 'c', '\0'};

然后我在没有空字符的情况下定义它:

char myarray[] = {'a', 'b', 'c'};

在这种情况下,空字符的重要性是什么?上例中没有空字符可能会在以后导致一些问题吗?...您是否建议在以这种方式定义 char 数组时始终包含或排除空字符?

感谢您的任何帮助 :)

4

6 回答 6

8

这意味着任何采用char*as 参数的东西,期望它是一个以 null 结尾的字符串,将调用undefined behavior,并以一种或另一种方式失败*

一些例子是strlenstd::string(const char*)构造函数,...的std::ostream operator<<特化char*

* 未定义的行为意味着它甚至可以“正确”工作,但不能保证这是可重现的。

于 2013-11-05T11:17:26.443 回答
3
char myarray[] = {'a', 'b', 'c'};  

如果你用 out 定义nul character它是一个valid character arraynot valid string

1.你不应该使用这个字符数组作为字符串函数的参数,如strlen()strcpy()等。

2.你不应该打印这个,因为我们用%sC打印字符串。

3.您可以逐字打印。

4.您可以逐个字符进行比较。

进一步char myarray[] = {'a', 'b', 'c', '\0'};等于"abc"

char myarray[] = {'a', 'b', 'c'};不等于"abc"

于 2013-11-05T11:23:23.820 回答
2

如果在定义 char 数组时将空字符排除在外,会发生什么情况?

您将获得一个仅包含您指定的字符的数组。

在这种情况下,空字符的重要性是什么?

在 C 中,通常将字符串表示为以空字符结尾的字符数组。这个约定有时在 C++ 中用于与 C 风格的接口互操作,或与字符串文字(从 C 继承其规范)一起工作,或者因为程序员出于某种原因认为这是一个好主意。如果您要这样做,那么显然您需要终止所有要解释为字符串的数组。

这个问题似乎是关于 C++ 的,尽管您出于某种原因也将其标记为 C。在 C++ 中,您通常希望使用它std::string来为您管理字符串。生命太短暂,不能乱搞低级数组和指针。

上面的例子中没有空字符可能会在以后导致一些问题吗?

如果您将未终止的数组传递给期望终止数组的函数,则它将踩下数组的末尾,从而导致未定义的行为。

您是否建议在以这种方式定义 char 数组时始终包含或排除空字符?

我建议了解数组的用途,如果它应该是 C 风格的字符串,则包括终止符。

于 2013-11-05T11:28:39.190 回答
2

如果您没有终止空字符,您仍然可以像使用空字符一样使用您的 char 数组。但是,期望以 null 结尾的字符串(如strlen)的函数不会在结尾处停止,因为它们不知道结尾在哪里。(这就是 null-char 的用途)因此它们将继续在内存中工作,直到它们超出界限并且您遇到分段错误或运行直到它们找到它们的 null-char。

基本上,如果您希望您的 char 数组是一个字符串,请附加一个空字符来表示结尾。

于 2013-11-05T11:21:33.237 回答
1

在这种情况下,空字符的重要性是什么?

高的。

上面的例子中没有空字符可能会在以后导致一些问题吗?

是的。char*采用指向此 C 字符串的 a 的 C 和 C++ 函数将要求它以空值结尾。

您是否建议在以这种方式定义 char 数组时始终包含或排除空字符?

两者都不。我建议使用std::string,因为您说您正在编写 C++。

于 2013-11-05T11:27:57.423 回答
1

如果您希望将数组用作字符串,则类似 strlen 的函数将使用空字符。如果我需要一个字符串,因为我想使用一些我写的文本:

const char* mystr = "abc"; // it is already null terminated

写作:

char myarray[] = {'a', 'b', 'c', '\0'};

是冗长的

于 2013-11-05T11:28:17.397 回答