2013-05-26 72 views
0

我想知道是否有方法從控制檯讀取日期格式爲dd.mm.yyyy的C語言。我有一個包含日期信息的結構。我嘗試了與日期,月份和年份的其他結構:日期格式dd.mm.yyyy在C中

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

但點是一個問題。任何想法?

+0

您可以請您下決定是否要在標題中加上dd/mm/yyyy,或者像dd.mm.yyyy中的問題一樣嗎? – Jens

+0

你可以從控制檯讀取一個字符串並自己解析它,這樣就可以檢查某個月是否有x天或每月var小於13等等。 – skytz

回答

3

嘗試:

Date d; 
    if (scanf("%d.%d.%d", &d.day, &d.month, &d.year) != 3) 
    error(); 
+2

'error()'做了什麼? – Paulpro

+0

'Date'是一個類型,而不是一個變量;我冒昧解決。 +1用於檢查scanf的返回。 – Jens

+0

@Jens:你說得對,謝謝(我錯過了'typedef') - @Paulpro:'error()'可能會顯示錯誤信息,並退出.. –

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()"); 
} 

更新

正副作用,他的行動方式addtional收益:

  • 沒有輸入驗證是必要的,因爲它是所有strptime()完成。
  • 更改輸入格式很簡單:只要fmt指向一個不同的格式字符串。
相關問題