C 样式字符串

C-style Character Strings

本文关键字:字符串 样式      更新时间:2023-10-16

在我的C++书中,有一个两页的C风格字符串部分(这似乎毫无意义,因为它两次告诉我们C++程序员不应该使用C风格的字符串),但我感到困惑的一件事是。两者之间有什么区别:

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

char ca[] = "cat";

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

第二个等效于

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

请注意终止NUL字符,在第一个示例中不存在。

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

C 样式字符串必须以 null 结尾,因为许多算法会查找 null。 如果字符串复制之类的内容从未找到 null,则可能永远不会结束。

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

caca2是相同的。 至于为什么你不必输入"cat\0"或类似的东西,这是因为这是一种非常常见的模式,语言制造商定义了双引号字符串的含义,以隐式包含 null。 这只是一个方便的事情

C 样式字符串以 null 结尾,因此数组末尾有一个填充

char ca[] = "cat";

与以下相同:

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

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

在C语言中语法

"cat"

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

所以当你写的时候

char ca[] = "cat";

您实际上是在定义一个包含 4 个字符的数组,末尾带有 ''。没有什么灾难性的。

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