1

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

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

char ca[] = "cat";

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

4

4 回答 4

5

第二个相当于

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

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

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

于 2013-09-16T04:39:50.647 回答
1

C 风格的字符串必须以空值结尾,因为许多算法都在寻找空值。如果它们永远找不到空值,则字符串复制之类的事情可能永远不会结束。

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

ca并且ca2是相同的。至于为什么你不必输入“cat\0”或类似的东西,这是因为这是一种常见的模式,语言制造商将双引号字符串的含义定义为隐式包含空值。它只是一个方便的东西

于 2013-09-16T04:41:20.847 回答
1

C 风格的字符串是以 null 结尾的,所以\0在数组的末尾有一个填充:

char ca[] = "cat";

是相同的:

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

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

于 2013-09-16T04:41:30.850 回答
0

C语言中的语法

"cat"

引入了一个无名数组对象(称为字符串字面量) ,由四个字符组成:'c''a'和. 这就是语言的定义方式。(只是为了实验,可以打印出来看看是4,不是3)。't''\0'sizeof("cat")

所以当你写

char ca[] = "cat";

您实际上是'\0'在最后定义一个由 4 个字符组成的数组。没有什么灾难性的。

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

于 2013-09-16T05:06:24.403 回答