C mktime() 打印问题
C mktime() printing issue
我正在研究按含义分隔字符的程序。目前我遇到了函数 konverzia 的问题。它应该将日期名称(星期三、星期四、星期五...)添加到日期字符串中,但它根本不在乎。日期必须看起来像这样 Wed 2012-02-01 感谢您的任何想法。
#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] != '[=10=]') {
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;
}
如果您想要特定格式,则必须构造一个自定义格式字符串。 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;
}
我正在研究按含义分隔字符的程序。目前我遇到了函数 konverzia 的问题。它应该将日期名称(星期三、星期四、星期五...)添加到日期字符串中,但它根本不在乎。日期必须看起来像这样 Wed 2012-02-01 感谢您的任何想法。
#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] != '[=10=]') {
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;
}
如果您想要特定格式,则必须构造一个自定义格式字符串。 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;
}