我正在做这个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);
}
答案 0 :(得分:6)
您想扫描三个整数,因此%d
中的每个数字应使用scanf
一次:
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
表示整数由最少两个符号打印,如果只有一个符号,则前缀为零。
确保输入符号的数量正确是比较棘手的。上述扫描模式也接受日期&#34; 1/1/1999&#34;。为了简化并避免单独扫描每个符号,可以将输入读取为字符串:
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.最大日期取决于月份和/或闰年。