fprintf的bug

时间:2014-03-12 02:19:01

标签: c printf

编辑:Welp看来我修好了......

header[3] = str 
strcpy(header[3], str) 

这些行在使用printf时产生相同的输出,但显然fprintf只是像strcpy一样。

这是我的代码:

int pgmWrite( const char **header, const int **pixels, int numRows, int numCols, FILE *out )
{
    int i, j;
    printf("%s\n\n", header[3]);
    for(i = 0; i < 4; i++)
        fprintf(out, "%s", header[i]);      

    printf("success in WRITE\n\n\n\n\n");

    for(j = 0; j < numRows; j++)
    {
        for(i = 0; i < numCols; i++)
            fprintf(out, "%d ", pixels[i][j]);

        fprintf(out, "\n"); 
    }
}

printf语句中,header[3]输出为237.

fprintf语句中,header[3]输出为乱码unicode字符。

如果有人想要我可以添加完整程序的怪物(300行),如果你真的希望看到一切正在做什么......

编辑:这是我的输出错误发生时(所有这些输出都来自上面的函数)

P2
# baboon.pgma created by PGMA_IO::PGMA_WRITE.
512  512
s· _    .   .
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  
 (plus a couple thousand more zeroes for the rest of the image)

FULL CODE FILE 1

FULL CODE FILE 2

TEST IMAGE FILE

产生错误:./ a.out -E 75 ./baboon.ascii.pgm testBaboon.pgm

1 个答案:

答案 0 :(得分:0)

编辑:我之前的例子基于一个char *指针数组,这不是OP的想法(感谢用户 0605002 指出它)。

下面是一个快速示例,概述了该问题的简单测试用例。在memcpy之后使用malloc可确保我们拥有有效的内存块,并在以后访问期间防止出现seg-fault。

#include <iostream>

using namespace std;

#define SIZE 8

int main()
{
    size_t size = sizeof(char*) * SIZE;
    char* test = "Test1234";

    char* *header = (char**) malloc(size);
    memcpy(header, "0", size);
    for(int i = 0; i < SIZE; i++)
    {
        header[i] = (char*) malloc(size);
        memcpy(header[i], "0", size);  
    }

    header[0] = test;
    header[1] = "abc";

    FILE * pFile;
    pFile = fopen("myfile.txt", "w");

    for(int i = 0; i < SIZE; i++)
        fprintf(pFile, "%s\n", header[i]); 

    fclose (pFile);

    free(header);

    return 0;
}