我在写一个文件时如何使用格式化的字符串有点混淆,而且一般来说我猜的是sprintf
。
#include <stdio.h>
int main(int argc, char* argv[])
{
FILE *fp;
const char *exts = ".txt";
char *saveToPath;
sprintf(saveToPath, "/Path/To/My/File%s", exts);
fp = fopen(saveToPath, "w+");
fprintf(fp, "This is testing for fprintf...\n");
fputs("This is testing for fputs...\n", fp);
fclose(fp);
}
我在尝试格式化的saveToPath时得到segmentation fault
,但是如果我使用像“/Path/To/My/File.txt”这样的普通字符串const char*
,那就可以了。
答案 0 :(得分:2)
将内存分配给saveToPath变量
e.g。
char saveToPath[100];
另外,请考虑使用snprintf来避免缓冲区溢出
e.g。
snprintf(saveToPath, 100 ,"/Path/To/My/File%s", exts);
这样你就可以确保你没有写出超过为saveToPath分配的100字节的任何东西
答案 1 :(得分:2)
char *saveToPath
仅声明指向char
的指针。它没有分配任何内存来保存你的角色。
你可以在堆栈上分配内存:
char saveToPath[1024];
或者你可以在堆上分配内存,如果你在编译时不知道你需要多少内存:
char *saveToPath = malloc(nsize * sizeof *saveToPath);
请记住在使用sprintf()
之前检查缓冲区溢出:
if(nsize < strlen("/Path/To/My/File") + strlen(exts) + 1)
/* error - BUFFER NOT ENOUGH*/
sprintf(saveToPath, "/Path/To/My/File%s", exts);
您可以使用snprintf()
,但请记住它是非标准的,如果您在可移植的程序中使用它,可能会回来咬你。
既然你说C
没有经验,我建议你养成编写便携式代码的习惯。
答案 2 :(得分:0)
你应该为saveToPath预先分配内存; char saveToPath [100]在栈中预先分配100个字节。但是,为了更安全和通用,我建议你编码如下:
const char *prefix = "/path/to/myfile";
const char *suffix = ".txt";
// here, 1 more bit for the terminal '\0'
char *saveToPath = (char *)calloc(sizeof(char), strlen(prefix) + strlen(suffix) + 1);
sprintf(saveToPath, "%s%s", prefix, suffix);
FILE *fp = fopen(...);
...
对于更安全的编码风格,请尝试使用snprintf而不是sprintf