Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
日期格式dd.mm.yyyy,C语言_C_Date_Stdin - Fatal编程技术网

日期格式dd.mm.yyyy,C语言

日期格式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)

我想知道是否有一种方法可以从控制台读取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();
尝试:

您可以使用将任意格式的日期字符串读入
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
    指向不同格式的字符串即可

让我们使用中定义的函数来实现以下目的: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名称等。要了解更多信息,请访问以下链接:


如果对你有帮助,一定要告诉我

让我们使用在中定义的函数,其目的就是: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:你是