[英]format specifier for sprintf doesn't work
所以我試圖從 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”都不起作用?! 有任何想法嗎?
請務必分配足夠長度的路徑名 memory。 一個安全的默認值是:
char filename[PATH_MAX];
如果使用正確,rest 將有效,例如:
sprintf(filename, "%ld.txt", test);
不要偷偷摸摸地使用extension
宏之類的東西:
ALL_CAPS
中,所以我們知道它們是宏sprintf
完全有能力連接,沒有必要訴諸這種卑鄙的方法。請注意,如果您無意中這樣做:
sprintf("filename", "%ld.txt", test);
然后sprintf
寫入static字符串"filename"
所占用的memory,這與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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.