2015-10-16 61 views
0

iam致力于按意义分隔字符的程序。目前我遇到了函数konverzia的问题。它应该添加日期的名字(星期三,星期四,星期五...)到日期字符串,但它没有给狗屎。日期必须看起来像这样星期三2012-02-01感谢您的任何想法。C mktime()打印问题

#include <stdio.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <time.h> 

void vstup (int i, char buffer[], int s, int c) 
    { 
     printf("\n Type text for analysis: \n ");  
     scanf ("%80s", buffer);  /* Read a string into buffer */ 
    } 
void detekcia (int i, char buffer[], int s, int c, int z) 
    { 
     while(buffer[i] != '\0') { 
      if(isalpha(buffer[i])) 
       s++;    /* Increment letter count  */ 
      if(isdigit(buffer[i++])) 
       c++;    /* Increment digit count  */ 
      if(ispunct(buffer[i++])) 
       z++; 
            } 
     if (s >= 1 && c >= 1) 
      printf("\n word: %s \n", buffer);  /*kombinacia cisla a pismena*/ 
     if (s >= 1 && c == 0) 
      printf("\n word: %s \n", buffer);  /*WORD*/ 
     if (s == 0 && c >= 1 && z == 0) 
      prvocislo (i,buffer,s,c);    /*NUMBER*/ 
     if (s >= 0 && c >= 1 && z >= 1) 
      datum (i,buffer,s,c,z);    /*DATE*/ 
} 
    int prvocislo (int i, char buffer[], int s, int c) /*prime number fun*/ 
    { 
     int x,count=0; 
     int k = atoi(buffer); 

     for (x=2; x<=k/2;x++){ 
      if (k%x==0){ 
       count++; 
        break; 
       } 
     } 
     if (count==0 && k!=1 && k!=0) 
      printf("\n number: %d (prime)\n",k); 
     else 
      printf("\n number: %d",k); 
    } 
    int datum (int i, char buffer[], int s, int c, int z) 
    { 
     int q = 0; 
     char d[2]; 
     char m[2]; 
     char r[4]; 

     if (buffer[4]=='-' && buffer[7]=='-') 
      q++;                       
    if (q==1 && buffer[5]<='1') 
      q++; 
     if (q==2 && buffer[8]<='3') 
      q++; 
     if (q==3){ 
      q++; 
      d[1]==buffer[9]; 
      d[0]==buffer[8]; 
      m[1]==buffer[6]; 
      m[0]==buffer[5]; 
      r[3]==buffer[3]; 
      r[2]==buffer[2]; 
      r[1]==buffer[1]; 
      r[0]==buffer[0]; 
       } 
     if (q==4) 
      konverzia (d,m,r); 
    } 
    int konverzia (char d[], char m[], char r[]) 
    { 
     int rr = atoi(r); 
     int dd = atoi(d); 
     int mm = atoi(m); 
     int ret; 
     struct tm info; 
     char date[10]; 

     info.tm_year = rr - 1900; 
     info.tm_mon = mm - 1; 
     info.tm_mday = dd; 
     info.tm_wday = dd; 

     ret = mktime(&info); 
     if (ret == -1){ 
     printf("time error"); 
         } 
     else{ 
      strftime(date, sizeof(date),"%c",&info); 
      printf(date); 
      } 

     return(0); 
    } 
    int main() { 

    char buffer[80]; 
    int i = 0; 
    int s = 0; /*pismeno*/ 
    int c = 0; /*cislo*/ 
    int z = 0; 
    vstup (i,buffer,s,c); 
    detekcia (i,buffer,s,c,z); 
    return 0; 
    } 
+0

“info.tm_wday” 给你0-6周一,周四,... - 所以去谷歌和寻找 “开关/箱”,并解决它。 – EGOrecords

+1

十个字符甚至不足以打印像2015-10-16这样的常规数据,更不用说一个工作日了。如果你想强制执行一个特定的日期格式,你可以自己构建它,而不是依赖于首选格式'%c'。 –

回答

1

如果你想要一个特定的格式,你必须构造一个自定义的格式字符串。可能的条目列在documentation for strftime中。您使用的%c格式只是您的语言环境的首选格式。

有一些问题与您的代码:

  • 你不应该设置tm_wday到该月的一天。 tm_wday是周日的索引,从周日的0开始。
  • 您应该将您的struct tm初始化为零,以便您不分配的字段不具有无意义的值。
  • 您的date缓冲区太短。 strftime防止溢出,但日期将被截断。
  • 请勿直接使用printf字符串,而应使用printf("%s", str)。特别是,格式字符串不应该是你不能控制的字符串。例如,strftime中未知的%序列可能未得到转换,并且在没有正确参数的情况下将被错误地解释为printf格式。一些静态分析工具坚持只使用字符串作为格式字符串。良好的做法,我认为。

所以:

int konverzia(const char d[], const char m[], const char r[]) 
{ 
    int rr = atoi(r); 
    int dd = atoi(d); 
    int mm = atoi(m); 

    struct tm info = {0}; 

    info.tm_year = rr - 1900; 
    info.tm_mon = mm - 1; 
    info.tm_mday = dd; 

    if (mktime(&info) == -1) { 
     printf("time error\n"); 
     return -1; 
    } else { 
     char date[20]; 

     strftime(date, sizeof(date), "%a %Y-%m-%d", &info); 
     printf("%s\n", date); 
    } 

    return 0; 
} 
+0

非常感谢您的宝贵时间,我非常感谢您的帮助,但看看它做了什么以输出::::::: .....键入文本进行分析: 2001-11-11 **星期二 - 1-11-30 **:...................和它无关我输入哪个输入,它总是给这个星期二日期 – MrBr

+0

我没有看多少在'konverzia'函数之外的程序中,我已经明确地测试了几个日期,比如'konverzia(“16”,“10”,“2015”);'我建议你检查你传入的字符串。再进行一些测试,我发现'mktime''正常化了“糟糕的输入,所以6月31日真的是7月1日。这意味着您应该添加额外的有效性检查,而不是依赖'mktime'返回-1。 –

+0

非常感谢!最后我发现了错误,现在它效果很好:) – MrBr