问题描述
因此,我试图在epochtime之外形成一个字符串以将其用作文件名,我以前一直在与printintg epochtime进行斗争,并且我得到了正确的转换和格式说明符的答案:这是
printf("%ju\n",(uintmax_t)epochdate);
现在,这是到目前为止尚无法使用的代码的简单示例:
#include <stdio.h>
#include <time.h>
#include <stdint.h>
#include <string.h>
#define EXTENSION ".txt"
int main(void)
{
struct tm t;
time_t t_of_day;
char* filename = NULL;
FILE *fp=NULL;
t.tm_year = 2019-1900; // Year - 1900
t.tm_mon = 7; // Month,where 0 = jan
t.tm_mday = 8; // Day of the month
t.tm_hour = 16;
t.tm_min = 11;
t.tm_sec = 42;
t.tm_isdst = -1; //dst unkNown
t_of_day = mktime(&t);
long test = (long)t_of_day;
sprintf("filename","%ld"EXTENSON,test);
printf("%s",filename);
fp = fopen(filename,"w");
if(fp == NULL)
{
printf("error");
}
}
再次的想法是获取时间,并将其与扩展名(此处为“ .txt”)一起使用以形成用于文件名的字符串。 我尝试过将类型转换为long double并使用“%ld”。我尝试过转换为uintmax_t并使用“%ju”都不起作用!有什么想法吗?
解决方法
请确保为足够长的路径名分配内存。安全默认值为:
char filename[PATH_MAX];
如果正确使用,其余的将正常工作,例如:
sprintf(filename,"%ld.txt",test);
不要全神贯注于extension
宏之类的东西:
- 通常,宏位于
ALL_CAPS
中,因此我们知道它们是宏 - 在代码中间使用带有字符串连接的宏看起来像语法错误。
-
sprintf
完全可以进行级联,因此无需采取诸如此类的卑鄙方法。
请注意,如果您不小心这样做:
sprintf("filename",test);
然后sprintf
写入由静态字符串"filename"
占用的内存,该静态字符串与filename
变量完全无关。这也是一个坏主意,因为它很容易溢出。
您可以简单地按照以下示例进行操作。
#include <stdio.h>
#define STRBUFFER 100
int main()
{
int num = 10;
char arr[] = "filename";
char extension[] = ".txt";
char newfile[STRBUFFER] = {0};
sprintf(newfile,"%s_%d%s",arr,num,extension);
printf("newfile = %s\n",newfile);
return 0;
}