c - 使用带有 %i 的 scanf 捕获日期时出现问题 (mm dd yyyy)

标签 c date printf scanf

我正在编写一个程序来计算两个日期之间经过的天数。为此,我必须在如下定义的结构中输入整数形式的日期:

struct date {
    int month;
    int day;
    int year;
};

现在,我已经弄清楚了如何运行我的程序,但当月份或日期是个位数时,用户无法以 (mm dd yyyy) 格式输入日期,这让我很烦恼。让我向您展示我的代码(请不要介意调试 printf 语句):

printf("Enter your start date (mm dd yyyy)\n");
scanf("%i %i %i", &startDate.month, &startDate.day, &startDate.year);
// DEBUG printf("Start date = %i/%i/%i\n", startDate.month, startDate.day, startDate.year);
// DEBUG printf("start date month = %i", startDate.month);

printf("Enter your end date (mm dd yyyy)\n");
scanf("%i %i %i", &endDate.month, &endDate.day, &endDate.year);
// DEBUG printf("End date = %i/%i/%i\n", endDate.month, endDate.day, endDate.year);

如果用户输入:

08 08 2004

那么开始日期记为

0/8/0

等于用户输入的前三位数字。好的,我明白了。我也知道用户只需输入“8 8 2004”,程序运行良好……但我相信编程是关于细节的,而这个是一个错误。谁能帮我解决这个问题?

最佳答案

使用 %i 转换说明符导致 scanf()解析输入,就像调用 strtol() 时使用 0 作为基本参数一样。因此,由于 080 开头,而 8 不是 xX,它将 08 视为一个八进制序列。但是,由于 8 不是有效的八进制数,它就停在那里,第一个数字的结果是 0

然后第二个数字得到 8,因为它由空格分隔。空格被跳过,第三个数字再次将 08 解析为八进制,导致第三个数字为 0。剩余的 8 和年份 2004 不被解析。

使用 %d 解析十进制数字。

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

如评论中所述,scanf() should generally be avoided .作为替代方案,您可以先使用 fgets() 检索整行输入,然后使用 sscanf() 进行解析。这允许更好的错误恢复,因为可以通过导致错误的行来诊断错误,并且也可以优雅地跳过该行。 scanf() 用于结构化输入,只能让您大致了解扫描错误发生的位置。而且,错误会导致输入堵塞,有时会导致调试 session 困惑。

关于c - 使用带有 %i 的 scanf 捕获日期时出现问题 (mm dd yyyy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473705/

相关文章:

python - ctypes 和结构数组

javascript - 在javascript中用空格替换日期中的字符

C 编程循环

javascript - 以西类牙语显示月份

c# - 人类可读的日期格式

c - 在 c printf 中无效使用 void 表达式

c - 加法在 c 中不起作用

c - fopen、fprintf、fclose 的单行代码?

c - Sizeof 指针与它在 printf 中的表示不同?

存在段错误的 C 程序