日期格式dd.mm.yyyy,C语言
我想知道是否有一种方法可以从控制台读取C中dd.mm.yyyy格式的日期。我有一个包含日期信息的结构。我尝试了另一种结构,只针对其中包含日期、月份和年份的日期:日期格式dd.mm.yyyy,C语言,c,date,stdin,C,Date,Stdin,我想知道是否有一种方法可以从控制台读取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)
typedef struct
{
int day;
int month;
int year;
} Date;
但这些点是个问题。有什么想法吗?试试:
Date d;
if (scanf("%d.%d.%d", &d.day, &d.month, &d.year) != 3)
error();
尝试:
您可以使用将任意格式的日期字符串读入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()");
}
#define _XOPEN_SOURCE/*glibc2需要它才能拥有strtime()*/
#包括
#包括
#包括
#包括
...
日期d={0};
char*fmt=“%d.%m.%Y”;
字符s[32]=“”;
char fmt_scanf[32]=“”;
int n=0;
sprintf(fmt_scanf,%%%ds),大小为-1;/*已为scanf()创建格式字符串*/
errno=0;
如果(1==(n=scanf(fmt_scanf,s)))
{
struct tm t={0};
char*p=strtime(s、fmt和t);
如果((s+strlen)(s))!=p)
{
fprintf(标准,无效日期:'%s'\n',s);
}
其他的
{
d、 日=t.tm\u mday;
d、 月份=t.tm_mon+1;/*tm_mon以零为基础*/
d、 年份=t.tm_年+1900;/*tm_年是自1900年起的年份。*/
}
}
其他的
{
perror(“scanf()”);
}
更新:
这样做的积极副作用和额外收益是:
- 无需输入验证,因为所有验证都由
完成strtime()
- 更改输入格式很简单:只需让
指向不同格式的字符串即可fmt
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()");
}
#define _XOPEN_SOURCE/*glibc2需要它才能拥有strtime()*/
#包括
#包括
#包括
#包括
...
日期d={0};
char*fmt=“%d.%m.%Y”;
字符s[32]=“”;
char fmt_scanf[32]=“”;
int n=0;
sprintf(fmt_scanf,%%%ds),大小为-1;/*已为scanf()创建格式字符串*/
errno=0;
如果(1==(n=scanf(fmt_scanf,s)))
{
struct tm t={0};
char*p=strtime(s、fmt和t);
如果((s+strlen)(s))!=p)
{
fprintf(标准,无效日期:'%s'\n',s);
}
其他的
{
d、 日=t.tm\u mday;
d、 月份=t.tm_mon+1;/*tm_mon以零为基础*/
d、 年份=t.tm_年+1900;/*tm_年是自1900年起的年份。*/
}
}
其他的
{
perror(“scanf()”);
}
更新:
这样做的积极副作用和额外收益是:
- 无需输入验证,因为所有验证都由
完成strtime()
- 更改输入格式很简单:只需让
指向不同格式的字符串即可fmt
#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;
}
#包括//printf
#包括//localtime、time、strftime
/*在此,将创建日志文件的名称*/
int main()
{
字符文件名[13];
//获得时间
时间是原始的;
struct tm*从时间上获得;
时间(&raw);
获取的时间=本地时间(&raw);
//在生成的时间之外获取字符串\u格式
int success_文件名;
success_filename=strftime(文件名,sizeof(文件名),%Y%m%d.log”,获得时间);//yyyymmdd.log
如果(成功_文件名!=0)
{
printf(“%s”,文件名);
}
获取的时间=空;
返回0;
}
`
strftime的第三个参数是您可以制作字符串配方的地方,有很多选项,例如天和月的缩写或全名、时间、秒、小时、分钟、AM/PM名称等。要了解更多信息,请访问以下链接:
如果对你有帮助,一定要告诉我 让我们使用在中定义的函数,其目的就是: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;
}
#包括//printf
#包括//localtime、time、strftime
/*在此,将创建日志文件的名称*/
int main()
{
字符文件名[13];
//获得时间
时间是原始的;
struct tm*从时间上获得;
时间(&raw);
获取的时间=本地时间(&raw);
//在生成的时间之外获取字符串\u格式
int success_文件名;
success_filename=strftime(文件名,sizeof(文件名),%Y%m%d.log”,获得时间);//yyyymmdd.log
如果(成功_文件名!=0)
{
printf(“%s”,文件名);
}
获取的时间=空;
返回0;
}
`
strftime的第三个参数是您可以制作字符串配方的地方,有很多选项,例如天和月的缩写或全名、时间、秒、小时、分钟、AM/PM名称等。要了解更多信息,请访问以下链接:
如果对你有帮助,一定要告诉我 你能决定你是想在标题中使用dd/mm/yyyy,还是想在问题中使用dd.mm.yyyy吗?你可以从控制台读取一个字符串,然后自己解析它,这种方法将检查某个月是否有x天或月变量是否低于13,以此类推。您能否决定是希望标题中的dd/mm/yyyy类还是问题中的dd.mm.yyyy类?您可以从控制台读取一个字符串,然后自己解析它,这种方法将检查某个月是否有x天或月var是否低于13,以此类推。
Date
是一种类型,而不是一个变量;我冒昧地修好了+1用于检查scanf的返回。@Jens:你是