【问题标题】:initializer-string for array of chars is too long C字符数组的初始化字符串太长 C
【发布时间】:2014-10-16 01:18:05
【问题描述】:

我正在开发一个程序,该程序接受输入并输出与输入相对应的数值。我得到了 char 部分的错误。我不明白为什么当数组中只有 27 个字符的大小为 27 时会出现这样的错误?

int main ()
{
    char greek[27] = "ABGDE#ZYHIKLMNXOPQRSTUFC$W3";
}

【问题讨论】:

标签: c arrays char


【解决方案1】:

您还需要一个 [28] 才能使结尾的 '\0' 成为有效字符串。

看看C Programming Notes: Chapter 8: Strings:

C 中的字符串由字符数组表示。的结束 字符串标有特殊字符,即空字符,它 只是值为 0 的字符。(空字符没有 除了在名称上与空指针的关系。在 ASCII 字符中 设置,空字符被命名为 NUL。)空字符或字符串终止 字符由另一个字符转义序列 \0 表示。

正如 Jim Balter 和 Jayesh 所指出的,当您提供初始值时,您可以省略数组大小(编译器使用初始值设定项的数量作为数组大小)。

char greek[] = "ABGDE#ZYHIKLMNXOPQRSTUFC$W3";

【讨论】:

  • 使用char greek[] 比使用char greek[28] 好得多。
  • @JimBalter 请问为什么?
  • @JimBalter 我希望您能进一步解释一下编译器如何处理方括号之间的“空白”。我知道有时会提到数组的长度,但是除非你动态分配内存,据我所知,编译器总是需要提前知道数组的长度,以便保留必要的空间堆栈。所以我再一次希望你能多解释一下“[]”。 IE。这是如何在幕后工作的。为什么不是那么明显?
  • @trilolil 你在回答自己:编译器总是需要提前知道数组的长度,以便在堆栈上保留必要的空间,但是手动计数是容易失败;例如char name[6] = "Ramón"; 不会为尾随的 NUL 留出空间,因为 ó 消耗 2 个字节,所以让编译器为你计算。
猜你喜欢
  • 2010-12-14
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 2019-12-08
  • 2015-12-26
相关资源
最近更新 更多