在我的C ++书中,有一个两页的C-Style Character Strings(这几乎看起来毫无意义,因为它告诉我们两次C ++程序员不应该使用C风格的字符串),但有一件事我很困惑是......有什么区别:
char ca[] = {'C', 'a', 't'};
和
char ca[] = "cat";
对于第一个,它表示它可能具有“灾难性”结果,因为c样式的字符串必须以空终止。但是第二个也不是c风格的字符串吗?为什么我不必键入“cat \ 0”或类似的东西?这不应该导致“灾难性后果”吗?
答案 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'};
ca
和ca2
完全相同。至于为什么你不必输入“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字符串始终为零终止。如果您的字符序列不是以零结尾,则它不是字符串。