为什么我会收到无效的初始化程序错误?
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");
我对 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");