fscanf崩溃我的C程序,不明白为什么

时间:2017-02-05 23:24:29

标签: c scanf

编辑:问题回答,我的第一个for循环中有一个拼写错误。非常感谢大家抓住这一点 我正在为uni工作一个C项目,我遇到了一个我无法弄清楚的问题。在程序的一个部分中,我必须将几个符号串读入结构中的2D字符数组(也称为“标记”)。这是我的函数中的代码:

stamp_t * read_stamp_type1(FILE * fptr)
{
    //variable declaration
    int r = 0, c = 0;

    //creating a struct stamp_t and mallocing memory
    stamp_t *newstamp1;
    newstamp1 = malloc(sizeof(stamp_t));

    //reading in values for the rows and columns of the "stamp" to be read in
    fscanf(fptr, "%d %d\n", &r, &c);

    //storing these values
    newstamp1->num_rows = r;
    newstamp1->num_cols = c;

    //creating memory for newstamp1's grid
    newstamp1->grid = malloc(sizeof(char *) * (r));
    for(int i=0; i < c; i++)
        newstamp1->grid[i] = malloc(sizeof(char) * (c+1));

    //string to temporarily store input
    char rowvalues[c+1];

    //Note: Everything works up until this point
    //the below lines crash the program every time
    for(int i = 0; i < r; i++)
    {
        fscanf(fptr, "%s", rowvalues);
        for (int j=0; j < c; j++)
            strcpy(newstamp1->grid[i], rowvalues);

    }

    free(rowvalues);

    return(newstamp1);

}

出于某种原因,当我尝试从文本文件中fscanf字符串时,它会使程序崩溃(或者至少是我认为原因是......)。 作为参考,这是结构声明:

// A structure for holding a stamp
typedef struct
{
   // The size of the contents of this stamp.
   int num_rows;
   int num_cols;

   // A 2D array of characters for a stamp.
   char **grid;
} stamp_t;

以下是该计划的输入:

3 4
.#.@ 
#.#. 
.#.@   

任何建议都会非常感激,我似乎无法找到代码的任何问题。我已经尝试手动为rowvalues数组中的每个值赋值,这工作正常(rowvalues [0] ='c';工作正常)。我需要将3行符号读入newstamp1.grid,这是一个2D数组。我运行了一个调试器,它说它试图写入不允许的内存(“访问冲突写入位置”)。我通过电子邮件发送了我的教授,但他过去一周没有上课,而且他没有回复电子邮件......
非常感谢提前。

2 个答案:

答案 0 :(得分:3)

对于初学者来说,这个循环中存在拼写错误

newstamp1->grid = malloc(sizeof(char *) * (r));
for(int i=0; i < c; i++)
             ^^^^^^
    newstamp1->grid[i] = malloc(sizeof(char) * (c+1));

必须有

for(int i=0; i < r; i++)
             ^^^^^^

此循环

    for (int j=0; j < c; j++)
        strcpy(newstamp1->grid[i], rowvalues);

没有意义。看来你的意思就是

strcpy(newstamp1->grid[i], rowvalues);

如果文件中的每一行都包含c个字符串,也许您必须分配一个3D字符数组(即字符串的二维数组)。

这句话

free(rowvalues);

错了。变量rowvalues具有自动存储持续时间。所以你可能不会为它调用函数free

答案 1 :(得分:2)

这部分代码是无稽之谈:

newstamp1->grid = malloc(sizeof(char *) * (r));
for(int i=0; i < c; i++)
    newstamp1->grid[i] = malloc(sizeof(char) * (c+1));

您分配了r项,然后for重复c次。这应该是相同的,rc。我打赌i < r是正确的条件。

另外,正如莫斯科的Vlad指出的那样,代码中还有一个错误:最终free不应该存在,因为它不是malloc ated。并且for-j行也可以省略。 (但它不应该产生任何错误,它只是不必要地重复相同的代码。)