Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
fscanf导致分段错误_C - Fatal编程技术网

fscanf导致分段错误

fscanf导致分段错误,c,C,我用星号括起来的那条线给了我一个分段错误。文件绝对不是空的。在我的程序中,我已经在其他地方使用了两次同一行代码,但在那里它的行为不是这样的 temp是一个整数;您必须传递其地址: void RdImage(FILE *fpi, char Image1[MAXROW][MAXCOL], int Nrows, int Ncols) { int i = 0, j = 0, temp; while (!feof(fpi)) { if (i % Nrows == 0) {

我用星号括起来的那条线给了我一个分段错误。文件绝对不是空的。在我的程序中,我已经在其他地方使用了两次同一行代码,但在那里它的行为不是这样的

temp
是一个整数;您必须传递其地址:

void RdImage(FILE *fpi, char Image1[MAXROW][MAXCOL], int Nrows, int Ncols) {
    int i = 0, j = 0, temp;

    while (!feof(fpi)) {
        if (i % Nrows == 0) {
            i = 0; 
            j++;
        }

        **fscanf(fpi, "%d", temp);**     

        if (temp == 1) {
            Image1[i][j] == AP;
        } else {
            Image1[i][j] == PL;
        }
        i++;
    }
}

在编译器中打开警告以捕获这样的错误。

temp
是一个整数;您必须传递其地址:

void RdImage(FILE *fpi, char Image1[MAXROW][MAXCOL], int Nrows, int Ncols) {
    int i = 0, j = 0, temp;

    while (!feof(fpi)) {
        if (i % Nrows == 0) {
            i = 0; 
            j++;
        }

        **fscanf(fpi, "%d", temp);**     

        if (temp == 1) {
            Image1[i][j] == AP;
        } else {
            Image1[i][j] == PL;
        }
        i++;
    }
}

在编译器中打开警告以捕获类似的错误。

请在fscanf中使用&temp而不是temp


fscanf(fpi、%d、&temp)

请使用&temp而不是fscanf中的temp

fscanf(fpi、%d、&temp)

根据C99标准

7.19.6.2 fscanf功能

%d
匹配格式与相同的可选带符号十进制整数 应为strtol函数的主题序列,值为10 对于基本参数

fscanf(fpi, "%d", &temp);
所以

是正确的。

根据C99标准

7.19.6.2 fscanf功能

%d
匹配格式与相同的可选带符号十进制整数 应为strtol函数的主题序列,值为10 对于基本参数

fscanf(fpi, "%d", &temp);
所以


是正确的。

带有
Image1[i][j]==
的两行没有操作(除非它们可能是未定义的行为)。请始终检查I/O函数的返回码,以便您至少知道它们是否正常工作。您确实不想在(!feof(whatever))时使用
。在这种情况下,看起来您真的想要更接近
的东西,而(1==fscanf(fpi,“%d”,&temp)){
(显然在循环中删除了对
fscanf
的调用)。带有
Image1[i][j]=
的两行没有操作(除非它们可能是未定义的行为)。请始终检查I/O函数的返回代码,以便您至少知道它们是否正常工作。您确实不想在(!feof(whatever))--任何时候使用
。在这种情况下,看起来您确实想要更接近
的东西,而(1==fscanf(fpi),%d,&temp)){
(显然,在循环中删除对
fscanf
的调用)。你可能是对的,但不要只是说“请尝试”,而不做任何解释……你可能是对的,但不要只是说“请尝试”没有任何解释…哦,哇,我觉得自己很愚蠢:直接从屏幕底部的编译器:/aImageScale.c:210:警告:格式“%d”要求类型为“int*”,但参数3的类型为“int”!是的,这就是警告的用途!许多程序员只是忽略了它们——如果您了解警告的含义,那么警告在很多情况下都非常有用嘿,你在说:)那些因为不理解而忽略警告的人,我会称他们为学生…@nneonneoOh-wow我觉得自己很愚蠢:直接从屏幕底部的编译器:/aImageScale.c:210:警告:格式“%d”需要类型“int*”,但参数3有类型“int”是的,这就是警告的用途!许多程序员只是忽略它们——warnings在很多情况下都非常有用,如果你理解他们所说的:)那些因为不理解警告而忽略警告的人,我会叫学生…@nneonneo