初始化char数组时null字符的重要性

时间:2013-11-05 11:16:29

标签: c++ c arrays

我是C ++的新手,我开始想知道,如果在定义char数组时保留null字符会发生什么?

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

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

然后我定义它而没有空字符:

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

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

感谢您的帮助:)

6 个答案:

答案 0 :(得分:8)

这意味着任何以char*作为参数,期望它是以空字符结尾的字符串的东西,都会调用未定义的行为,并以某种方式失败 *

一些示例包括strlenstd::string(const char*)构造函数,std::ostream operator<<的{​​{1}}专门化...

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

答案 1 :(得分:3)

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

如果您使用nul character定义,则valid character array不是valid string

1.您不应该将此字符数组用作strlen()strcpy()等字符串函数的参数。

2.我们不应该打印这个,因为我们在C中用%s打印字符串。

3.您可以逐个字符打印。

4.你可以逐字逐句地比较。

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

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

答案 2 :(得分:2)

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

基本上,如果你想让你的char数组成为一个字符串,请附加一个null-char来表示结尾。

答案 3 :(得分:2)

  

如果在定义char数组时保留空字符会发生什么?

你得到的数组只包含你指定的字符。

  

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

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

问题似乎是关于C ++,尽管你也出于某种原因标记了C语言。在C ++中,您通常希望使用std::string来管理字符串。生活太短暂,无法搞乱低级数组和指针。

  

上面的示例中是否缺少空字符会导致以后出现一些问题?

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

  

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

我建议理解数组应该用于什么,并且如果它应该是C风格的字符串,则包括终止符。

答案 4 :(得分:1)

  

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

高。

  

上面的示例中是否缺少空字符会导致以后出现一些问题?

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

  

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

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

答案 5 :(得分:1)

如果您希望将数组用作字符串,那么

null字符将由类似strlen的函数使用。如果我需要一个字符串,因为我想使用我写的一些文字:

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

写作:

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

是详细的