2015-11-03 31 views
2

我基本上正在尝试创建一个日期和时间作为其名称的日志文件。这是我的代码在使用Linux的C中的分段错误(核心转储) - 特例

 char logger [500]; 

    time_t time1; 
    struct tm * timeinfo; 
    time (&time1); 
    timeinfo = localtime (&time1); 
    sprintf(logger, "TestTreiber_%d%d%d%d%d%d.log",timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec); 

    printf("All logging during this test is done in : %s",logger); 

    sprintf(logger, "prot/%s",logger);//STEP 1: I encounter the error here 

    FILE *logFile; 
    logFile= fopen(logger,"w"); 

没有第1步,每件事情都很好。它在我的程序所在的同一个文件夹中创建了一个我想要的名称的日志文件。但是当我将第1步加入混音时,它会给我这个错误。

Segmentation Fault (core dumped) 

我是新来的Linux,但我知道它是与记忆,所以我增加了分配给记录仪内存[500](早前255工作得很好了)。但我似乎无法解决这个问题。 prot文件夹确实存在于我正在运行的目录中。请帮忙!

PS对不起,大写字母的错误用法,我正在使用德语键盘。

+6

你不能'sprintf'字符串本身,你在'sprintf(记录器,“prot /%s”,记录器)。 –

+0

plus用spprintf替换sprintf这样更安全 – fghj

+0

@ user1034749我做了这个,但仍然是相同的错误。 – ITguy

回答

2

你不应该在你的代码为此,

sprintf(logger, "prot/%s",logger); 

mansprintf报价,

一些程序过于草率依赖代码,如下面

sprintf(buf, "%s some further text", buf);

将文本追加到buf。但是,标准明确指出,如果sourcedestination缓冲区在调用sprintf(),snprintf(),vsprintf()和vsnprintf()时重叠,则结果不明确。根据所使用的gcc版本和所使用的编译器选项,上述调用不会产生预期结果。

+1

up for man page :) – LBes

+0

@LBesancon手册页非常有帮助! –

+0

谢谢你解决了这个问题。 – ITguy

1

因此,首先将sprintf()更改为snprintf(),但您也必须更改您给该函数的参数。确实,来源和目的地必须有所不同。如果它们不是,我想它会给出未定义的行为。

所以做这样的事情:

sprintf(newlogger, "prot/%s",logger); 
2

正如其他人告诉你了,sprintf目标缓冲区和字符串参数不能重叠。

您首先构建基本名称,然后打印它,然后想要预先指定它的路径。您可以使用两种不同的缓冲区的基本名称和路径,但你也可以构建完整的路径在一次提取与basename路径的基本名称从<libgen.h>打印:

const char *prefix = "prot"; 
char logger [500]; 

time_t time1 = time(NULL); 
struct tm *ti = localtime (&time1); 

snprintf(logger, sizeof(logger), 
    "%s/TestTreiber_%d%02d%02d%02d%02d%02d.log", prefix, 
    ti->tm_year + 1900, ti->tm_mon + 1, ti->tm_mday, 
    ti->tm_hour, ti->tm_min, ti->tm_sec); 

printf("Logger is '%s'.\n", basename(logger)); 
printf("(Full path is '%s'.)\n", logger); 

(你应该把所有的输出字段除了第2年的数字宽,并填充0格式的%02d,以便文件名是明确的。)