c - 在C中初始化字符串;以下有用吗?

标签 c string initialization

我知道如何用两种不同的方式在 C 语言中初始化字符串。

char str[] = "abcd";

char str[] = {'a','b','c','d','\0' };

清楚地写 "abcd" 而不是 {'a','b','c','d','\0' } 可以节省时间并且舒服。

是否有任何特殊原因我们可以像最后一行那样初始化字符串?它在某些情况下有用还是多余?

最佳答案

一般来说,没有区别。除了一些高级异常(exception),如下...

  • 在某些情况下,您需要一个不是有效 C 字符串的字符数组 - 也就是说,不是以 null 结尾。那么必须使用后一种形式。不过,只有一些非常特殊的情况需要这样的字符串:非常古老的 Unix 代码和某些嵌入式系统实现。

  • 后一种形式的另一个优点是更好的转义序列。字符串文字的转义序列有点损坏。假设我想打印一个代码为 0xAA 的扩展符号,然后是字符串“ABBA”。 puts("\xAAABBA"); 不会编译,因为它将 \x 后面的所有内容都作为十六进制。 char str[] = {'\xAA','A','B','B','A','\0'}; puts(str); 虽然工作正常。 (然而,您也可以将字符串文字拆分为多个,以实现相同的效果:"\xAA""ABBA"。)

  • 使用字符串字面值进行初始化也存在此处讨论的微妙但严重的 C 语言缺陷:
    Inconsistent gcc diagnostic for string initialization

关于c - 在C中初始化字符串;以下有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69083397/

相关文章:

c++ - 公共(public) : static constant string declaraion/initialization issue

javascript - JS : Escaping a string with backslash at the end of a string, 用于与 jQuery 函数一起使用

c# - 使用 ODP.NET (C#) 将对象传递给 oracle 包中的过程时必须使用哪种数据库类型?

c - 光学字符阅读代码或指南

c - 动态二维数组,检查给定 "X"的大小

java - 用字符串填充 Double 列表

c# - 查看 DLL 文件的内容

c++ - C/C++ 私有(private)数组在头文件中初始化

c++ - 奇怪的行为,用 int 初始化函数指针?

c++ - 初始化标准流对象