这个代码有什么问题吗?我运行总是出错,希望能得到帮助。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a, b, c, d;
printf("请输入年,月,日");
scanf("%d %d %d", &a, &b, &c);
printf("这天是&d", a);
printf("年的");
switch (b)
{
case('1'):
{
printf("%d", c);
break;
}
case('2'):
{
d = c + 31;
printf("%d", d);
break;
}
case('3'):
{
d = c + 59;
printf("%d", d);
break;
}
case('4'):
{
d = c + 90;
printf("%d", d);
break;
}
case('5'):
{
d = c + 120;
printf("%d", d);
break;
}
case('6'):
{
d = c + 151;
printf("%d", d);
break;
}
case('7'):
{
d = c + 181;
printf("%d", d);
break;
}
case('8'):
{
d = c + 212;
printf("%d", d);
break;
}
case('9'):
{
d = c + 243;
printf("%d", d);
break;
}
case('10'):
{
d = c + 273;
printf("%d", d);
break;
}
case('11'):
{
d = c + 304;
printf("%d", d);
break;
}
case('12'):
{
d = c + 334;
printf("%d", d);
break;
}
printf("天");
}
return 0;
}
不仅是case判断类型的出错问题,你没有考虑过闰年的情况,我给你修改了代码
开始运行...
请输入年,月,日:2023 6 26
这天是2023年的第177天
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int isLeapYear(int year) {
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
return 1;
}
return 0;
}
int main()
{
int year, month, day;
printf("请输入年,月,日:");
scanf("%d %d %d", &year, &month, &day);
int days_per_month[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (isLeapYear(year)) {
days_per_month[1] = 29;
}
int total_days = day;
for (int i = 0; i < month - 1; i++) {
total_days += days_per_month[i];
}
printf("这天是%d年的第%d天\n", year, total_days);
return 0;
}
b是 int 型数据, 你case里面确是 char类型数据匹配, 肯定是不能匹配到的,你要改成 int 型, case 1: 等等,所有匹配都需要改造
另外 打印是哪一年也有问题,你需要这样
printf("这天是%d年的", a);
1.&d改为%d
2.case里不要加括号,引号都去掉,是数字与数字比较,不要把数字和字符比较
3.2月是28天还是29天不用判断吗,不管闰年吗
#include <stdio.h>
int main() {
int year, month, day;
printf("请输入年,月,日:");
scanf("%d %d %d", &year, &month, &day);
int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int days = 0;
for (int i = 0; i < month - 1; i++) {
days += days_in_month[i];
}
days += day;
if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0) && month > 2) {
days += 1;
}
printf("这天是%d年的第%d天\n", year, days);
return 0;
}
题主的代码,应该这么改:
#include <stdio.h>
int main()
{
int date = 0, year = 2008, month = 8, day = 8;
printf("请输入(年 月 日):");
scanf("%d %d %d", &year, &month, &day);
switch (month)
{
case 12:date += 30;
case 11:date += 31;
case 10:date += 30;
case 9: date += 31;
case 8: date += 31;
case 7: date += 30;
case 6: date += 31;
case 5: date += 30;
case 4: date += 31;
case 3:
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
date += 29;
else
date += 28;
case 2:
date += 31;
case 1:
date += day;
printf("%d年%d月%d日是该年的第%d天", year, month, day, date);
break;
default:
printf("error");
break;
}
return 0;
}
这个报错并不重要,写入声明即可解决。
问题解答:
根据参考资料,#define_CRT_SECURE_NO_WARNINGS是用来解决使用scanf、strcpy、strlen、strcat等函数会出现的报错,通过它可以关闭编译器的警告,让代码可以正常运行。因此,如果出现了这种报错,可以在代码开头使用#define_CRT_SECURE_NO_WARNINGS 1来进行解决。但是需要注意的是,这种做法并不建议,因为关闭编译器的警告可能会导致代码存在安全隐患。所以,更好的做法是使用编译器提供的安全版本函数。
如果你的代码中只使用了那些会出现警告的函数,那么可以使用编译器提供的安全版本函数来解决问题。例如,使用scanf_s替代scanf,使用strcpy_s替代strcpy等等。这样就可以消除编译器的警告并且提高代码的安全性。
另外,如果你想关闭编译器的警告,也可以在代码开头加上#define _CRT_SECURE_NO_WARNINGS,这样就可以避免在使用scanf、strcpy、strlen、strcat等函数时出现警告。但是需要注意的是,这样做可能会导致代码存在安全隐患,因为编译器提供的警告通常都是为了提醒开发者代码中存在的潜在安全问题。
综上所述,解决该问题的最好方法是尽可能地使用编译器提供的安全版本函数来进行替换,并根据编译器的警告进行相应的修改。如果想关闭编译器的警告,需要慎重考虑存在的安全隐患。