基本的clang:sprintf将int重置为0

时间:2017-06-04 14:13:56

标签: c

请考虑以下事项:

int fileNo = 0;
sprintf(outfile, "%03d.jpg", fileNo);

然后再

fileNo++; // fileNo equals 1 now

然后,如果你再次打电话:

sprintf(outfile, "%03d.jpg", fileNo);

fileNo现在再次等于0。

此处的目标是在fileNo中保留一个计数器,然后将该值传递给sprintf以设置文件名。有没有更简单的方法将计数器转换为字符串值?或者我错过了一个可能阻止fileNo重置为零的步骤?

我一直在研究malloc,但是在必要的时候还不是很清楚。帮助

(我不是编程新手,但对C来说是新手。)

更新

这是一个非常简单的程序。没有重新分配。当我进入调试器时,在sprintf行执行后,fileNo立即重置为0。

...

static int fileNo = 0;
char outfile[7];
sprintf(outfile, "%03d.jpg", fileNo);

...

 while(fread(buffer, 1, 512, inptr) == 512)
 {
    // 0xff 0xd8 0xff
    if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff)
    {
        if (!found1stJPG)
        {
            found1stJPG = true;

        } else {
            fileNo++;
            fclose(outptr);
            sprintf(outfile, "%03d.jpg", fileNo); // fileNo is 1 before this executes
            printf("outfile: %s,\n", outfile); // in the debugger fileNo is now 0
        }

1 个答案:

答案 0 :(得分:2)

您有以下内容:

char somecharvariable;
char outfile[7];
int fileNo = 0;
sprintf(outfile, "%03d.jpg", fileNo);

糟糕。字符串null终止符写在fileno上。 outfile应该是长度8.如果你允许fileNo超过999,你的代码无论如何都会崩溃。

将静态标志放在fileNo上并不能解决问题。它只是将问题重新定位到其他变量。