【发布时间】:2019-08-14 09:13:47
【问题描述】:
所以我有这个简单的代码,我找到了here。我想让它循环工作。我用不同的方法尝试了几次,但输出很糟糕。在 Ubuntu Visual Studio 中工作
编辑我添加了if(y>=2015 && y<=3000),它工作正常吗?
EDIT 2 我已经修改了我的代码并遵循了@Sergey 的建议...它仍然无法正常工作... 我尝试添加“检查 scanf 的返回值”,但它也不起作用。
if ((scanf("%u", &d) == 1) && (scanf("%u", &m) == 1) && (scanf("%u", &y) == 1))
while (fdateCheck());
else
//...EOF or conversion failure...
while (fdateCheck());
或
while ((rc = scanf("%u.%u.%u", &d, &m, &y)) != EOF)
{
if (rc != 3)
//...oops data problems...
else
//...all OK...
}
需要有关检查 scanfs 返回的建议
int fdateCheck();
unsigned int d,m,y;
unsigned int daysinmonth[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int rc;
int legit = 0;
int main()
{
printf("Enter the date\n");
scanf("%u.%u.%u",&d,&m,&y);
while (fdateCheck());
}
int fdateCheck()
{
if (y % 400 == 0 || (y % 100 != 0 && y % 4 == 0))
{
daysinmonth[1]=29;
}
else if (y >= 2015 && y <= 3000)
{
if (m < 13)
{
if (d <= daysinmonth[m-1])
legit = 1;
}
if (legit == 1)
{
system("clear");
printf("It is a legitimate date!\n");
return 0;
}
}
else
system("clear");
int ch = fgetc(stdin);
if (ch == '\n')
{
system("clear");
printf("It's not a legitimate date!\n");
printf("\nRetry: ");
return 1;
}
fflush(stdin);
}
【问题讨论】:
-
不要像
0x0A一样使用magic numbers。如果您的意思是换行符'\n',请明确说明。 -
另外,递归调用
main是一个非常糟糕的习惯。改用真正的循环。 -
检查scanf的返回值。处理错误。然后事情可能会开始变得有意义。
-
另一件事,你应该在你的闰年检查上有一个 else,否则如果它曾经设置为 29,它将在所有年份保持这种状态。