【问题标题】:Initializing and declaring a character array in C在 C 中初始化和声明一个字符数组
【发布时间】:2015-02-03 05:27:10
【问题描述】:

这行得通。

char s[] = {'\x20', '\x09', '\x0a', '\x0d'};

这些不是因为“错误:']'(或'}')标记之前的预期表达式”:

char s[4];
s = {'\x20', '\x09', '\x0a', '\x0d'};

char s[4];
s[]= {'\x20', '\x09', '\x0a', '\x0d'};

char s[4];
s[4]= {'\x20', '\x09', '\x0a', '\x0d'};

是否有任何正确的方法可以在不使用索引的情况下在两条不同的行上定义和初始化?我知道我可以说:

char s[4];
s[0] = '\x20';
s[1] = '\x09';
s[2] = '\x0a';
s[3] = '\x0d';

但出于好奇,我是否遗漏了一些微不足道的东西,或者这在 C 中是不可避免的吗?

【问题讨论】:

  • 问题是,为什么您需要在两条不同的线路上执行此操作?
  • 定义一个结构然后使用它。
  • 这里没有结构体。这些是字符数组。
  • 在不同的规则集之后,结构和数组的初始化方式不同。此外,您通常将 typedef 与结构一起使用,但不与数组一起使用。
  • 我的问题涉及到我误解的核心问题。它已针对此进行了简化。这个问题的答案教会了我如何在结构中定义一个字符数组,然后在我的代码中的其他地方初始化它,我的结构是在哪里创建的。

标签: c character character-arrays


【解决方案1】:
char s[] = {'\x20', '\x09', '\x0a', '\x0d'};

如您所见,未指定数组的大小,因此您需要在此处使用初始化程序,并根据初始化程序计算数组的大小并将其存储在堆栈中。

即使你有

char s[4];

s = {'1','2','3','4'};

这行不通,因为在 C 中,标准规定 数组不可分配

如果您需要初始化,请在声明时执行它,因为您已经在执行其他操作,否则按字符填充数组 char 或使用 strcpy() 等内置函数

【讨论】:

  • 感谢您的帮助。
  • 它也不起作用,因为{1,2,3,4} 不是表达式。如果你有typedef struct {char a,b,c,d;} char4;,那么你可以做char4 c; c = (char4){1,2,3,4};
  • @rici 是的,这里有一个带有 typedef 的新类型,但数组名不能是可分配的左值
  • @JeremyRosenberg 没有问题
  • @Gopi;我知道。我的观点是,您需要在大括号表达式之前显式转换 (char4) 才能使用大括号文字。在 C99/11 中。我本可以从数组中创建一个结构——typedef struct {char a[4];} char4;,但是 gcc/clang 会烦人地抱怨缺少大括号,坚持char4 c; c = (char4){{1,2,3,4}};
【解决方案2】:
#include <string.h>

char s[5];
strcpy(s, "\x20\x09\x0a\x0d");

【讨论】:

  • 谢谢,其他人也回答了类似的问题,但您显示了确切的代码。
【解决方案3】:

你不能在声明后没有索引就这样分配。

因此您可以使用strcpystrcat 的组合进行分配。

第一个你可以使用strcpy,然后是strcat。

strcpy(s,"\x20");
strcat(s,"\x09");
strcat(s,"\x0a");
strcat(s,"\x0d");

或者使用strcpy一次性复制全部内容。

【讨论】:

  • 感谢您的帮助,不过@Gopi 在您之前的回答类似。
猜你喜欢
  • 2011-06-26
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 2013-10-22
  • 2021-04-15
  • 2011-05-02
  • 2018-05-20
相关资源
最近更新 更多