繁体   English   中英

C样式字符串

[英]C-style Character Strings

在我的C ++书中,有两页的C样式字符串(这似乎毫无意义,因为它两次告诉我们C ++程序员不应该使用C样式字符串),但是我感到困惑的是。之间有什么区别?

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

char ca[] = "cat";

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

第二个相当于

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

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

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

C样式字符串必须以null终止,因为许多算法都寻找null。 如果像字符串复制之类的东西永远找不到空值,它们可能永远不会结束。

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

caca2相同。 至于为什么不必键入“ cat \\ 0”之类的原因,是因为这是语言制作者将双引号字符串的含义定义为隐式包含null的常见模式。 这只是一个方便的事情

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

char ca[] = "cat";

是相同的:

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

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

C语言的语法

"cat"

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

所以当你写

char ca[] = "cat";

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM