C 替代数据格式

C 替代数据格式,c,C,我有两个struct对象存储两个不同的日期。我希望确保它们的格式为(dd/mm/yyyy)|(dd-mm-yyyy),然后取它们之间的差异 如果不是dd/mm/yyyy格式,则打印标准错误,但它似乎不接受这两种格式 #include <stdio.h> #include <time.h> #include <stdlib.h> #include <errno.h> /* # Objective: date1.c is to write in tw

我有两个struct对象存储两个不同的日期。我希望确保它们的格式为(dd/mm/yyyy)|(dd-mm-yyyy),然后取它们之间的差异

如果不是dd/mm/yyyy格式,则打印标准错误,但它似乎不接受这两种格式

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

/*
# Objective: date1.c is to write in two dates and determine the difference 
in the number of days between them.
Must be date inputs must be written into console as <day>/<month>/<year> | 
<day>-<month>-<year>
*/ 

int minimumYear = 0; // O AD
int maximumYear = 10000; // 10000 AD

// Struct for the date
typedef struct {
    int dd;
    int mm;
    int yyyy;
} dateFormat; 

您应该使用
fgets()
将输入作为字符串读入数组,并尝试使用
sscanf()
根据这两种格式对其进行解析。如果两种格式均与输入不匹配,则投诉:

int main() {
    char buf[128];
    dateFormat getDate1;

    //input correct date
    fprintf(stderr, "Enter date in format (day/month/year): ");
    if (!fgets(buf, sizeof buf, stdin)) {
        fprintf(stderr, "premature end of file\n");
        return 1;
    }
    if (sscanf(buf, "%d/%d/%d", &getDate1.dd, &getDate1.mm, &getDate1.yyyy) != 3
    &&  sscanf(buf, "%d-%d-%d", &getDate1.dd, &getDate1.mm, &getDate1.yyyy) != 3) {
        fprintf(stderr, "invalid date: %s", buf);
        return 1;
    }
    ...
}

请写一篇。@Yunnosch谢谢,我试图让它更符合标准。我想你应该再看一次链接。然后尝试编译这里显示的代码,它将失败。然后尝试方便地编译代码,即不复制两次或编辑。不能。@Osman:“读取一行,然后用
sscanf()
解析它”的一个主要好处就是,你可以尝试使用不同的格式解析数据,这在直接调用
scanf()
fscanf()
时非常难做到100%可靠。@JonathanLeffler,谢谢你,请记住:)
int main() {
    char buf[128];
    dateFormat getDate1;

    //input correct date
    fprintf(stderr, "Enter date in format (day/month/year): ");
    if (!fgets(buf, sizeof buf, stdin)) {
        fprintf(stderr, "premature end of file\n");
        return 1;
    }
    if (sscanf(buf, "%d/%d/%d", &getDate1.dd, &getDate1.mm, &getDate1.yyyy) != 3
    &&  sscanf(buf, "%d-%d-%d", &getDate1.dd, &getDate1.mm, &getDate1.yyyy) != 3) {
        fprintf(stderr, "invalid date: %s", buf);
        return 1;
    }
    ...
}