c - 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", "%ld.txt", test);
然后写入与变量完全无关sprintf
的静态字符串占用的内存。这也是一个坏主意,因为这很容易溢出。"filename"
filename
推荐阅读
- carousel - Instagram 轮播图片过期
- java - 将 Spark 中的现有行添加到另一个数据集 (Spark Java 2.3.1)
- python - 对于某些线程,Python 多处理循环总是停止
- json - 将 Excel 转换为 JSON 数组以上传到 SQL Server
- python - 如何在 Python 中以对数比例绘制优势比
- openstack - 与 ceph rbd 集成后,openstack 实例的映像名称丢失
- python - 以编程方式折叠 Tix hlist 清单中的分支?
- apache - 将mod_perl加载到xampp时如何调试“找不到符号”?
- android - 如何允许用户从 Android 应用程序登录 AWS 控制台
- android - 如何从适配器获取复选框值到片段