簡體   English   中英

sprintf 的格式說明符不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM