为什么我会收到无效的初始化程序错误?

Why am I getting an invalid initializer error?

我对 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);

}

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

在这个表达式中

((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" ;

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

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

char leapYear[2];
leapYear[0] = ((year % 4) == 0) ? ((year / 100 % 4) == 0 ? 'y' : 'n') : 'n' ;
leapYear[1] = '[=10=]'; // 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");