0

我想知道是否有办法以 C 中的 dd.mm.yyyy 格式从控制台读取日期。我有一个包含日期信息的结构。我尝试了另一种结构,仅用于包含日、月和年的日期:

typedef struct
{
    int day;
    int month;
    int year;
} Date;

但这些点是个问题。任何想法?

4

3 回答 3

3

尝试:

  Date d;
  if (scanf("%d.%d.%d", &d.day, &d.month, &d.year) != 3)
    error();
于 2013-05-26T17:12:24.340 回答
1

您可以使用strptime()将任意格式的日期字符串读入struct tm.

#define _XOPEN_SOURCE /* glibc2 needs this to have strptime(). */
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <errno.h>

...

Date d = {0};
char * fmt = "%d.%m.%Y";
char s[32] = "";
char fmt_scanf[32] = "";
int n = 0;

sprintf(fmt_scanf, "%%%ds", sizeof(s) - 1); /* Created format string for scanf(). */

errno = 0;    
if (1 == (n = scanf(fmt_scanf, s)))
{
  struct tm t = {0};
  char * p = strptime(s, fmt, &t);
  if ((s + strlen(s)) != p)
  {
    fprintf(stderr, "invalid date: '%s'\n", s);
  }
  else
  {
    d.day = t.tm_mday;
    d.month = t.tm_mon + 1; /* tm_mon it zero-based. */
    d.year = t.tm_year + 1900; /* tm_year is years since 1900. */ 
  }
}
else
{
  perror("scanf()");
}

更新

采用这种方式的积极副作用和额外收益是:

  • 不需要输入验证,因为这一切都由strptime().
  • 更改输入格式很简单:只需让fmt指向不同的格式字符串。
于 2013-05-26T17:16:09.740 回答
0

让我们为此目的使用定义的函数:strftime()!(感谢 tutorialpoints.com 提供有关 C 标准库的详细信息)

它有什么作用?它允许我们创建一个包含尽可能多的日期和/或时间的字符串,无论我们希望它拥有它们,如果需要,还可以在字符串中添加其他字符!例如,如果我们想为今天的日志创建一个文件名,我们可以创建一个“20191011.log”字符串。

这是为此所需的代码:

#include<stdio.h>//printf
#include<time.h>//localtime,time,strftime


/*Here, the log file's name will be created*/
int main()  
{
    char filename[13];
    //Obtaining time
    time_t raw;
    struct tm *obtained_time;

    time(&raw);
    obtained_time = localtime (&raw);


    //Obtaining string_format out of generated time
    int success_filename;

    success_filename = strftime(filename,sizeof(filename),"%Y%m%d.log",obtained_time);//yyyymmdd.log
    if (success_filename != 0)
    {
            printf("%s",filename);
    }
    obtained_time = NULL;

    return 0;
}

`

strftime 的第三个参数是您可以制作字符串配方的地方,并且有很多选项,例如日期和月份的缩写或全名、时间、秒、小时、分钟、AM/PM 指定等。更多探索它们,请访问以下链接: 关于 strftime() 函数的教程点

如果它对你有帮助,请告诉我!

于 2019-10-11T06:19:09.600 回答