C风格的字符串

时间:2013-09-16 04:38:40

标签: c++ string

在我的C ++书中,有一个两页的C-Style Character Strings(这几乎看起来毫无意义,因为它告诉我们两次C ++程序员不应该使用C风格的字符串),但有一件事我很困惑是......有什么区别:

char ca[] = {'C', 'a', 't'};

char ca[] = "cat";

对于第一个,它表示它可能具有“灾难性”结果,因为c样式的字符串必须以空终止。但是第二个也不是c风格的字符串吗?为什么我不必键入“cat \ 0”或类似的东西?这不应该导致“灾难性后果”吗?

4 个答案:

答案 0 :(得分:5)

第二个相当于

char ca[] = {'c', 'a', 't', '\0'}

请注意第一个示例中没有的终止NUL字符。

您不必键入"cat\0",因为在使用字符串文字初始化数组时,编译器会自动添加NUL字符。他们是规则。

答案 1 :(得分:1)

C样式字符串必须以null结尾,因为许多算法都会查找null。如果字符串副本从未找到空值,那么它们可能永远不会结束。

char ca[] = "cat";
char ca2[] = {'C', 'a', 't', '\0'};

caca2完全相同。至于为什么你不必输入“cat \ 0”或类似的东西,因为这是一个常见的模式,语言制定者定义双引号字符串的含义隐含地包含null。这只是一件方便的事情

答案 2 :(得分:1)

C样式字符串以空值终止,因此在数组末尾有一个填充\0

char ca[] = "cat";

与:

相同
char ca[] = {'c', 'a', 't', '\0'};

再次注意这个数组有4个元素。

答案 3 :(得分:0)

在C语言中的语法

"cat"

引入了一个无名数组对象(称为字符串文字),由四个字符组成:'c''a''t''\0'。这就是语言的定义方式。 (仅为了实验,您可以打印sizeof("cat")并查看它是4,而不是3)。

所以当你写

char ca[] = "cat";

你实际上是在最后用'\0'定义了一个包含4个字符的数组。没有什么灾难性的。

第一个声明根本不是C字符串。根据定义,C字符串始终为零终止。如果您的字符序列不是以零结尾,则它不是字符串。