使用fscanf进行C分段错误

时间:2016-04-06 16:27:31

标签: c io scanf

尝试使用fscanf读取输入.txt文件,并将行内容存储到int变量,数组和2D数组中,以便稍后我可以使用该值进行计算。我认为这里的问题是因为我没有使用fscanf处理“EOF”?

这是我的代码:

int main(){
FILE *fp;

int n;  // # resources
int m;  // # processes
int avail[n];
int max[m][n], allo[m][n];
char temp1[10];

fp = fopen("test.txt", "r");
if (fp == NULL){
    exit(EXIT_FAILURE);
}


fscanf(fp, "%d %d", &n, &m);
printf("%d %d", n, m);
printf("\n");

// Store the second line content to allo[]
for(int i = 0; i < n; i++){
    fscanf(fp, "%s", temp1);
    avail[i] = atoi(temp1);
    printf("%d ", avail[i]);
}
printf("\n");

// Store the line3-7 content to 2D max[][]
for(int i = 0; i < m; i++){
    for(int j = 0; j < n; j++){
        fscanf(fp, "%s", temp1);
        max[i][j] = atoi(temp1);
        printf("%d ", max[i][j]);
    }
    printf("\n");
}

// Store the line8-12 content to 2D allo
for(int i = 0; i < m; i++){
        for(int j = 0; i < n; j++){
            fscanf(fp, "%s", temp1);
            allo[i][j] = atoi(temp1);
            printf("%d ", allo[i][j]);
        }
        printf("\n");
}


fclose(fp);
return 0;
}

这是.txt输入文件:

3 5
9 6 3
5 5 2
4 1 3
8 3 4
5 4 2
4 4 3
0 1 0
1 1 0
1 0 2
0 0 1
1 2 2

这是输出:

3 5
9 6 3
5 5 2
4 1 3
8 3 4
5 4 2
4 4 3
Segmentation fault: 11

4 个答案:

答案 0 :(得分:1)

问题在于:

int n;  // # resources
int m;  // # processes
int avail[n];
int max[m][n], allo[m][n], need[n][m];
声明2D数组n时,

mmax 初始化。尝试在n等之前打印mint max[m][n];,您会看到它们包含垃圾值。

因此,您正在体验未定义的行为,因为您无法确定阵列的大小。

将其更改为:

int n;  // # resources
int m;  // # processes

fscanf(fp, "%d %d", &n, &m);
printf("%d %d", n, m);

int avail[n];
int max[m][n], allo[m][n], need[n][m];

现在,当您创建数组时,nm将使用从文件中读取的值进行初始化。

如果您想在阅读nm之前声明数组,那么您应该使用指针,阅读nm,然后阅读dynamically allocate the arrays

答案 1 :(得分:0)

int max[m][n], allo[m][n], need[n][m]m尚未设置时,您声明n,因此它们的大小未知。尺寸设定后,它们不会调整大小。因此,写这些内容将为您提供未定义的行为&#34;

答案 2 :(得分:0)

由于在您的文件顶部声明数组时m,n未初始化:

int avail[n];
int max[m][n], allo[m][n], need[n][m];
正如@WeatherVane在评论中所说,你会得到未定义的行为。也许你正在覆盖程序内存的其他部分(谁知道它是未定义的!)。

如果您需要动态数组创建,您应该执行以下操作:

int* avail;
...
fscanf(fp, "%d %d", &n, &m);
avail = (int*)malloc(n*sizeof(int));

答案 3 :(得分:0)

初始化max,allo和need时。 n和m的值没有定义。

您可以将maxalloneed定义为int**

扫描了n和m的值后,可以调用以下函数为上面的2D数组分配内存。

int ** get2DintArray(int r, int c){
    int **arr = (int **)malloc(r * sizeof(int *));
    for (i=0; i<r; i++)
         arr[i] = (int *)malloc(c * sizeof(int));
    return arr;
}

有关。例如: -

allo = get2DintArray(m,n);
need = get2DintArray(n,m);

这种方法对于n和m的较高值很方便,其中堆栈内存可能不够,因为在这种情况下你使用堆内存。