如何在具有一位数字的月份上扫描“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。
我正在做这个 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。