我想知道是否有办法以 C 中的 dd.mm.yyyy 格式从控制台读取日期。我有一个包含日期信息的结构。我尝试了另一种结构,仅用于包含日、月和年的日期:
typedef struct
{
int day;
int month;
int year;
} Date;
但这些点是个问题。任何想法?
尝试:
Date d;
if (scanf("%d.%d.%d", &d.day, &d.month, &d.year) != 3)
error();
您可以使用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
指向不同的格式字符串。让我们为此目的使用定义的函数: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() 函数的教程点
如果它对你有帮助,请告诉我!