[英]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'};
ca
和ca2
相同。 至于为什么不必键入“ 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.