当前位置: 首页 > 知识库问答 >
问题:

使用fscanf的C分段故障

聂风史
2023-03-14

正在尝试读取输入。txt文件,并使用fscanf将行内容存储到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

共有3个答案

邹玄裳
2023-03-14

由于在文件顶部声明数组时,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));
盖高畅
2023-03-14

您声明int max[m][n],allo[m][n],需要[n][m],而mn尚未设置,因此它们的大小未知。设置大小后,它们不会调整自己的大小。所以写这些会给你“不确定的行为”

吴伟志
2023-03-14

问题在于:

int n;  // # resources
int m;  // # processes
int avail[n];
int max[m][n], allo[m][n], need[n][m];

声明2D数组max时,nm未初始化。在int max[m][n]之前尝试打印nm ,等等,您将看到它们包含垃圾值。

因此,未定义的行为就是您所经历的,因为您无法真正判断数组的大小。

把它改成这样:

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,然后动态分配数组。

 类似资料:
  • 编辑:底部的工作代码 我对编程相对较新,我正在试图理解为什么这不起作用。我决定通过一个函数而不是来处理卡片,以保持它尽可能模块化。这是我下面的代码;我知道错误与指针有关,但我不明白我做错了什么。 工作代码:

  • 我试图创建一个文件来读取包含CSV的文本文件。然而,出于某种原因,一些fscanf不返回值,但有些返回值。 为什么第一个fscanf返回一个值,而其他所有fscanf都不返回一个值。我什么也看不见,它们看起来都一样,格式相同。文件格式如下: 您使用什么功能打开文件?,fscanf、fclose、fopen、main、3 以下哪项不是变量类型?,int,float,char,string,4

  • 我在用C++编写链表实现时遇到了一个问题。每当我试图添加一个元素,我得到分段错误错误。 提前感谢!

  • 问题内容: 我有一个用于捕获任何分段错误或ctrl- c的应用程序。使用下面的代码,我能够捕获分段错误,但是该处理程序一次又一次地被调用。我该如何阻止他们。供您参考,我不想退出我的申请。我只是可以小心释放所有损坏的缓冲区。 可能吗? 处理程序就是这样。 在这里,对于Segmentation故障信号,处理程序被多次调用,并且很明显MyfreeBuffers()给我释放已释放的内存的错误。我只想释放一

  • 我有一个便宜的5美元/月的服务器,1G内存为我的网站处理一些图像。在将GIF图像写入磁盘时,我很少会遇到PHP Imagick的分割错误。 我在console命令上设置了一个内存限制,希望PHP能够首先捕获这个问题,并抛出一个我可以正确处理的异常,但这不起作用。 特别的问题是某些GIF图像会导致它在这行代码中崩溃: 特定的GIF是与成人相关的GIF,因此我不确定是否可以共享它。 以下是我的服务器日

  • 我有一个应用程序,我用它来捕捉任何分割错误或ctrl-c。使用下面的代码,我能够捕获分段错误,但是处理程序被一次又一次地调用。我怎样才能阻止他们。告诉你,我不想退出我的申请。我只是可以小心释放所有损坏的缓冲区。 可能吗? handler是这样的。 这里的分段故障信号,处理程序被多次调用,因为明显的MyFreeBuffers()给我释放已经释放的内存的错误。我只想免费一次,但仍然不想退出应用程序。