如何从字符串初始化char数组

Arn*_*ard 15 c

我想做以下事情

char a[] = { 'A', 'B', 'C', 'D'};
Run Code Online (Sandbox Code Playgroud)

但我不想单独写这些字符.我想要类似的东西

#define S "ABCD"

char a[] = { S[0], S[1], S[2], S[3] };
Run Code Online (Sandbox Code Playgroud)

但这不会编译(gcc说'初始化元素不是常数').

我尝试用#define替换

const char S[] = "ABCD";
Run Code Online (Sandbox Code Playgroud)

但这似乎没有帮助.

我怎么能这样(或类似的东西)让我把"ABCD"写成普通的'字符串',而不是四个单独的字符?

PS似乎人们没有正确地阅读这个问题......

我无法编译以下代码:

const char S[] = "ABCD";
char t[] = { S[0], S[1], S[2], S[3] };
char u[] = { S[3], S[2], S[1], S[0] };
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 18

你不能 - 在C中.在C中初始化全局和局部静态变量的设计使得编译器可以将值静态地放入可执行文件中.它不能将非常量表达式作为初始化器处理.并且只有在C99中,您可以在聚合初始化器中使用非常量表达式 - 在C89中不是这样!

在您的情况下,由于您的数组是包含字符的数组,因此每个元素必须是一个算术常量表达式.看看它对这些的看法

算术常量表达式应具有算术类型,并且只能具有整数常量,浮点常量,枚举常量,字符常量和sizeof表达式的操作数.

当然,初始化程序不会满足这一点,它使用指针类型的操作数.当然,另一种方法是使用字符串文字来初始化数组,正如它所解释的那样

具有静态存储持续时间的对象的初始化程序中的所有表达式应为常量表达式或字符串文字.

所有报价均摘自C99 TC3委员会草案.总而言之,你想要做什么 - 使用非常量表达式 - 不能用C完成.你有几个选择:

  • 多次写你的东西 - 一次颠倒,另一次不反转.
  • 改变语言 - C++可以做到这一切.
  • 如果你真的想这样做的东西,用数组char const*代替

这是我最后一个选项的意思

char const c[] = "ABCD";
char const *f[] = { &c[0], &c[1], &c[2], &c[3] };
char const *g[] = { &c[3], &c[2], &c[1], &c[0] };
Run Code Online (Sandbox Code Playgroud)

这很好用,因为地址常量表达式用于初始化指针

地址常量是空指针,指向静态存储持续时间的对象的左值的指针,或指向函数指示符的指针; 它应该使用一元&运算符或一个转换为指针类型的整数常量显式创建,或者通过使用数组或函数类型的表达式隐式创建.array-subscript []和member-access.和 - >运算符,地址&和间接*一元运算符和指针强制转换可用于创建地址常量,但不能使用这些运算符访问对象的值.

你可能有运气调整你的编译器选项 - 另一个引用:

实现可以接受其他形式的常量表达式.


Meh*_*ari 5

只是

const char S[] = "ABCD";
Run Code Online (Sandbox Code Playgroud)

应该管用。

你的编译器是什么?


小智 5

另一种选择是使用 sprintf。

例如,

char buffer[50];
sprintf( buffer, "My String" );
Run Code Online (Sandbox Code Playgroud)

祝你好运。