我想知道是否有办法以C格式dd.mm.yyyy从控制台读取日期。我有一个结构,其中包含日期信息。我尝试了另一种结构,只是为了日期,月份和年份:
typedef struct
{
int day;
int month;
int year;
} Date;
但点是个问题。有什么想法吗?
答案 0 :(得分:3)
尝试:
Date d;
if (scanf("%d.%d.%d", &d.day, &d.month, &d.year) != 3)
error();
答案 1 :(得分: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
指向不同的格式字符串。答案 2 :(得分: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指定的缩写或全名。等等。要进一步探索它们,请访问以下链接: Tutorialspoint on strftime() function
请告诉我它是否对您有帮助!