【问题标题】:format specifier for sprintf doesn't worksprintf 的格式说明符不起作用
【发布时间】:2021-02-24 04:29:30
【问题描述】:

所以我试图在 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”都不起作用!!有什么想法吗?

【问题讨论】:

  • 哦,extension 是一个宏,这真是鬼鬼祟祟。当您确实有sprintf 时,这真的不是这样做的方法。使用"%ld.txt" 说明您在做什么。
  • 您也不能将sprintf 转换为像"filename" 这样的常量字符。您需要写入缓冲区。你的意思是sprintf(filename, "%ld.txt", test)?如果是,filename就是NULL,所以需要先分配内存。建议:char filename[PATH_MAX].
  • @thart 行是我要问的。这是错误的,我的问题是如何纠正它。语法没有错。但更多的是格式说明符。
  • @Barmar 刚刚看到了。

标签: c string epoch


【解决方案1】:

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

char filename[PATH_MAX];

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

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

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

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

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

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

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

【讨论】:

  • sprintf("filename, "%ld%s", test, extension);怎么样
  • @Barmar 我认为宏只是妨碍了,应该被淘汰,但这也是一个好方法。
  • @Barmar 扩展不是变量。这是一个宏。
  • @BeNicePlz 所以?它扩展为一个字符串,您可以将该字符串用作sprintf() 的参数。
  • “在代码中间使用带有字符串连接的宏看起来像语法错误。” --> 像"Print a 32-bit type " PRId32 "\n" 一样,或者您是否主张不使用标准库宏作为格式说明符? “不要对扩展宏之类的东西偷偷摸摸”正在剥夺 OP 抽象扩展的好主意。以此处建议的格式嵌入它会产生更高的维护代码。
【解决方案2】:

您可以按照以下示例进行操作。

#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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    相关资源
    最近更新 更多