如何在具有一位数字的月份上扫描“0”?

How to scan a "0" on the months that have one digit?

我正在做这个 C 程序,我需要输入一个日期并查看它是否是有效日期。但是,我不知道如何在具有一位数字的日期和月份前面扫描一个“0”。此外,该程序还需要扫描“/”。如果用户输入“07-14-1999”,它必须是无效的,因为用户没有输入“/”。这两个问题该怎么办?以下是我到目前为止的代码。谢谢。

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

int main()
{
    int day, month, year;
    printf("Please enter a date to check validity (in the form of MM/DD/YYYY): ");
    scanf("%i%i/%i%i/%i%i",&month, & month, &day, &day, &year, &year, &year &year);


    printf("%i%i/%i%i/%i%i",month, month, day, day, year, year, year, year);


}

您想扫描三个整数,因此您应该对 scanf 中的每个数字使用一次 %d:

scanf("%d/%d/%d", &month, &day, &year);

要验证输入,检查成功扫描整数的数量是有意义的:

int res = scanf("%2d/%2d/%4d", &month, &day, &year);
if (res != 3) {
     /* error */
}

此处%2d表示该输入整数的最大长度为2位。 如果所有内容都被正确扫描,您可以验证月、日和年的范围。

要打印前导零:

printf("%02d/%02d/%04d", month, day, year);

这里%02d表示整数最少打印两个符号,如果只有一个符号则在前面加上零。


确保输入符号的数量正确是比较棘手的。上面的扫描模式也接受日期“1/1/1999”。为了简化和避免单独扫描每个符号,可以将输入读取为字符串:

int day, month, year;
/* buffer length is enough for 10 date symbols + 1 null terminating
 * character + 1 for too long input */
char buf[12];
char dummy_end_test;

printf("Please enter a date to check validity (in the form of MM/DD/YYYY): ");

/* scan as a string with maximum field width 11, check that the number
 * of input characters is exactly 10 */
if (scanf("%11s", buf) != 1 || strlen(buf) != 10) {
    printf("incorrect input length\n");
    return 1;
}

/* parse integer numbers from string
 * try to read symbol dummy_end_test to filter input as 11/1/19999 or 11/11/199x
 * if it is possible to read one more character after four digits of year
 * the number of scanned entries is 4 that is invalid input */
int ret = sscanf(buf, "%2d/%2d/%4d%c", &month, &day, &year, &dummy_end_test);

if (ret != 3) {
    printf("error\n");
    return 1;
}

这里我使用了 sscanf 从字符串中扫描格式化输入。

无论如何,需要验证日月年的范围。所有这些数字都必须大于 0。最大天数取决于闰年的月份 and/or。