我是C ++的新手,我开始想知道,如果在定义char数组时保留null字符会发生什么?
例如,如果我使用空字符定义char数组:
char myarray[] = {'a', 'b', 'c', '\0'};
然后我定义它而没有空字符:
char myarray[] = {'a', 'b', 'c'};
在这种情况下,空字符的重要性是什么?以上示例中是否缺少null字符会导致以后出现一些问题?...您是否建议在以这种方式定义char数组时始终包含或排除空字符?
感谢您的帮助:)
答案 0 :(得分:8)
这意味着任何以char*
作为参数,期望它是以空字符结尾的字符串的东西,都会调用未定义的行为,并以某种方式失败 *
一些示例包括strlen
,std::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'};
是详细的