如何在有一位数的月份扫描"0"?

1 c slash

我正在做这个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);


}
Run Code Online (Sandbox Code Playgroud)

Ore*_*era 6

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

scanf("%d/%d/%d", &month, &day, &year);
Run Code Online (Sandbox Code Playgroud)

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

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

这%2d意味着该输入整数的最大长度为2位数.如果所有内容都已正确扫描,您可以验证月,日和年的范围.

要打印前导零:

printf("%02d/%02d/%04d", month, day, year);
Run Code Online (Sandbox Code Playgroud)

这%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;
}
Run Code Online (Sandbox Code Playgroud)

在这里,我使用sscanf扫描格式化的字符串输入.

无论如何,需要验证日,月和年的范围.所有这些数字必须大于0.最大日期取决于月份和/或闰年.

  • 我对这个问题的解读是,OP想要准确地解析DD/MM/YYYY.显示的代码将接受不正确的输入.例如"1/9/2015"或"001/009/15".可能应该在`scanf`中包含宽度说明符并检查其返回值. (2认同)