写入文件时的C格式字符串

时间:2015-06-01 05:26:51

标签: c printf

我在写一个文件时如何使用格式化的字符串有点混淆,而且一般来说我猜的是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*,那就可以了。

3 个答案:

答案 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