sprintf的格式说明符不起作用

问题描述

因此,我试图在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;
}