【问题标题】:Sscanf and fgets proper usage in C - NOTE: editedSscanf 和 fgets 在 C 中的正确用法 - 注意:已编辑
【发布时间】:2014-03-11 10:59:37
【问题描述】:

我正在尝试制作一个用于制作公历的大型程序,但目前,我只是在尝试使用解析输入日期的函数。一些函数(sscanf 和 fgets)我不太确定如何将它们与程序的其余部分一起使用。这是我的尝试:

 int main(int arg, char *argv[]) {

    /*
     * Request a date from the user
     * in format DD-MM-YYYY, DD.MM.YYYY or DD/MM/YYYY
     */
    date d; 
    char input_date[20];
    fgets(input_date, 20, stdin); 

    printf("Enter your date of birth in the form DD/MM/YYYY:");
    //fgets(d, 100, stdin);
    sscanf(input_date,"%d", &d.day, &d.month, &d.year);
     if (leapYearFeb(d.year, d.month)) {
                d.day = d.day + 1;
        }

    if (parse_formatted_date(input_date, &d))
        printf("date: %s\ndd = %d, mm = %d, yy = %d\n", input_date, d.day, d.month, d.year);
    return 1;

    return 0; 
}

这是我调用 parse_formatted_date 的 date.h 头文件:

#ifndef DATE_H_
#define DATE_H_

// Define the structure date.
typedef struct {
    int day;
    int month;
    int year;

} date;

// Parses a string 'formatted_date' representing a date
// in format DD-MM-YYYY, DD.MM.YYYY or DD/MM/YYYY
// into a structure date 'parsed_date'.
void parse_formatted_date(char * formatted_date, date * parsed_date) {
    const int ret = sscanf(formatted_date, "%d-%d-%d",
            &parsed_date->day,
            &parsed_date->month,
            &parsed_date->year);
    //printf("Day: %d, Month: %d, Year: %d\n", d.day, d.month, d.year);
    //return ret == 3;

    }
#endif

目前,我遇到的错误是:

main_Assignment4.c: In function ‘main’:
main_Assignment4.c:22: error: void value not ignored as it ought to be

不确定这些错误是什么意思或如何解决? 谢谢!

【问题讨论】:

  • 再次sscanf(input_date,"%d", &d.day, &d.month, &d.year); 错误。看看你错过了什么?
  • 不抱歉...我该如何解决?
  • if (parse_formatted_date(input_date, &d)) 是错误的,因为您将 void parse_formatted_date 声明为 void 返回类型,因此它会将 error.make 返回类型设置为 int
  • 哦,好的。那么通过将返回类型设为 int,sscanf 现在可以从该函数中读取数据了吗?
  • no no..sscanf 没有从中读取。但是为什么你把if 条件简单地放在parse_formatted_date(input_date, &d) 没有if

标签: c fgets scanf gregorian-calendar


【解决方案1】:

修改后的答案

// Parses a string 'formatted_date' representing a date
    // in format DD-MM-YYYY, DD.MM.YYYY or DD/MM/YYYY
    // into a structure date 'parsed_date'.
    void parse_formatted_date(char * formatted_date, date * parsed_date)
    {
        sprintf(formatted_date, "%d-%d-%d",
        parsed_date->day,
        parsed_date->month,
        parsed_date->year);
    }


     int main(int arg, char *argv[]) {

        /*
         * Request a date from the user
         * in format DD/MM/YYYY
         */
        date d; 
        char input_date[20];
        printf("Enter your date of birth in the form DD/MM/YYYY:");
        fgets(input_date, 100, stdin);
        sscanf(input_date,"%d/%d/%d", &d.day, &d.month, &d.year);

        parse_formatted_date(input_date, &d);

        printf("date: %s dd = %d, mm = %d, yy = %d\n", input_date, d.day, d.month, d.year);
        return 0; 
    }

【讨论】:

  • 如果从控制台读取,sscanf(d, "%s/%s/%s", input_date); 也应该是 scanf(...)
  • @user3306583 如果它适合您,请接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多