【问题标题】:Why am I getting an invalid initializer error?为什么我收到无效的初始化程序错误?
【发布时间】:2019-11-09 12:55:29
【问题描述】:

我对 C 比较陌生,我正在尝试编写一个简单的代码来检查一年是否是闰年。 这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int year;
    printf("%s","Please enter a year: ");
    scanf("%d",&year);
    char leapYear[] = ((year % 4) == 0) ? ((year / 100 % 4)==0 ? "y": "n"):"n" ;
    printf("%s", leapYear);

}

我收到一个无效的初始化程序错误,我不知道为什么。

【问题讨论】:

  • 初始化程序必须是在编译时计算的常量表达式。你的不是一个恒定的表达。使用:char leapYear[2]; leapYear= ...
  • @PaulOgilvie:不,它不需要是一个常量表达式。具有静态或线程存储持续时间的对象的初始化程序需要是常量表达式或字符串文字(C 2018 6.7.9 4)。 leapYear 具有自动存储期限。而char leapYear[2]; leapYear= ... 将不起作用,因为数组不可分配。
  • @EricPostpischil,弗拉德的好回答!没听懂。

标签: c arrays initialization implicit-conversion


【解决方案1】:

在这个表达式中

((year % 4) == 0) ? ((year / 100 % 4)==0 ? "y": "n"):"n"

字符串文字被转换为指向它们的第一个元素的指针,你不能用指针初始化一个字符数组。

为了更清楚,请考虑以下演示程序

#include <stdio.h>

int main(void) 
{
    char s1[] = "y";
    char s2[] = "y" + 0;
}

第一个数组声明

    char s1[] = "y";

将成功编译。使用字符串文字来初始化数组。

第二个数组声明

    char s2[] = "y" + 0;

不会编译,因为在表达式中字符串文字被转换(很少有例外)为指向它们的第一个元素的指针。

改用以下方法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    int year;
    printf("%s","Please enter a year: ");
    scanf("%d",&year);
    char leapYear[2];
    strcpy( leapYear, ( (year % 4 ) == 0) ? ((year / 100 % 4)==0 ? "y": "n"):"n" );
    printf("%s", leapYear);
}

正如 Paul Ogilvie 在评论而不是数组中所写,您可以定义一个指针,如

const char *leapYear = ((year % 4) == 0) ? ((year / 100 % 4)==0 ? "y": "n"):"n" ;

【讨论】:

  • char *leapYear = ...?
  • “因为在表达式中字符串文字被转换为指向它们的第一个元素的指针” 这就是确定的答案!太好了!
  • 优秀的答案。我知道它不能以这种方式工作,但我不知道为什么。现在我知道为什么了。
【解决方案2】:

如果未指定大小,编译器会根据分配的 const 字符串表达式计算 c 字符串的大小,该表达式在您的代码中不存在(字符串 leapYear 的值取决于给定条件)。

因此,如果要在一行中提供条件,则必须预设数组的大小:

char leapYear[2];
leapYear[0] = ((year % 4) == 0) ? ((year / 100 % 4) == 0 ? 'y' : 'n') : 'n' ;
leapYear[1] = '\0'; // so that you don't get garbage in your terminal

编辑

我忘记了strcpy() 所以这里是(感谢@Vlad):

char leapYear[2];
strcpy(leapYear, ((year % 4 ) == 0) ? ((year / 100 % 4) == 0 ? "y" : "n") : "n");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多