首页 > 解决方案 > 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”都不起作用!!有任何想法吗?

标签: cstringepoch

解决方案


确保为足够长的路径名分配内存。一个安全的默认值是:

char filename[PATH_MAX];

如果使用得当,其余的都会解决,例如:

sprintf(filename, "%ld.txt", test);

不要对extension宏之类的东西偷偷摸摸:

  • 通常宏在,ALL_CAPS所以我们知道它们是宏
  • 在代码中间使用带有字符串连接的宏看起来像语法错误。
  • sprintf完全能够连接,没有必要采取这样卑鄙的方法。

请注意,如果您无意中这样做:

sprintf("filename", "%ld.txt", test);

然后写入与变量完全无关sprintf的静态字符串占用的内存。这也是一个坏主意,因为这很容易溢出。"filename"filename


推荐阅读