c - 段错误: Reading values from a text file

标签 c segmentation-fault

在我的代码中,我尝试从 .txt 文件读取值以构建我的邻接矩阵,但它不断返回段错误。我似乎无法指出我哪里出错了。请帮忙。

#include <stdio.h>
#include <unistd.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/time.h>
#include <math.h>
#include <limits.h>
#include <iostream>


#define MAX_VERTICES 1024

int global_adj_matrix[MAX_VERTICES][MAX_VERTICES];


int **graph_tree;
int **node_data;
int global_weight;
int number_threads;
int max_nodes;
int random_node;
int max_weight;
int finish_flag;

void readAdjMatrix();


int main(int argc, char *argv[]){

    for(int i = 0 ; i < MAX_VERTICES ; i++){
        for(int j = 0 ; j < MAX_VERTICES ; j++){
            global_adj_matrix[i][j] = 0;
        }
    }

    number_threads = atoi(argv[1]);
    max_nodes = 0;

    readAdjMatrix();

}

void readAdjMatrix(){

    int source, destination, edge_weight;

    max_nodes = INT_MIN;
    max_weight = INT_MIN;

    FILE *file_pointer = fopen("graph.txt", "r");

    while(!feof(file_pointer)){
        fscanf(file_pointer, "%d", &source);
        fscanf(file_pointer, "%d", &destination);
        fscanf(file_pointer, "%d", &edge_weight);

        global_adj_matrix[source][destination] = edge_weight;
        global_adj_matrix[destination][source] = edge_weight;

        if(edge_weight > max_weight)
            max_weight = edge_weight;

        if(destination > max_nodes)
            max_nodes = destination;
    }

    printf("%d %d", max_weight, max_nodes);

    for(int i = 0 ; i <= max_nodes ; i++){
        for(int j = 0 ; j <= max_nodes ; j++){
            printf("%d\t", global_adj_matrix[i][j]);
        }
        printf("\n");
    }

    fclose(file_pointer);
}

这是我的 .txt 文件

0 1 281
0 2 242
0 3 344
0 4 340
0 5 372
0 6 161
0 7 49
0 8 278
0 10 190
0 11 213
0 12 55
0 13 239
0 14 321
0 15 162
1 0 281
1 2 249
1 3 58
1 4 331
1 5 189
1 6 84
1 7 259
1 9 256
1 11 188
1 12 149
1 13 330
1 14 17
1 15 370
2 0 242
2 1 249
2 3 125
2 4 179
2 5 355
2 6 11
2 7 232
2 8 199
2 9 67
2 10 390
2 12 312
2 13 3
2 14 237
2 15 96
3 0 344
3 1 58
3 2 125
3 4 105
3 5 192
3 6 180
3 7 335
3 8 280
3 9 185
3 10 66
3 11 65
3 13 274
3 14 72
3 15 282
4 0 340
4 1 331
4 2 179
4 3 105
4 5 149
4 6 286
4 7 265
4 8 359
4 9 341
4 10 211
4 11 367
4 12 340
4 13 14
4 14 69
4 15 128
5 0 372
5 1 189
5 2 355
5 3 192
5 4 149
5 6 167
5 7 268
5 8 20
5 9 270
5 10 210
5 11 369
5 12 131
5 13 133
5 15 167
6 0 161
6 1 84
6 2 11
6 3 180
6 4 286
6 5 167
6 7 208
6 8 335
6 9 353
6 10 12
6 11 307
6 12 199
6 13 273
6 14 118
7 0 49
7 1 259
7 2 232
7 3 335
7 4 265
7 5 268
7 6 208
7 8 182
7 9 327
7 10 272
7 11 198
7 12 103
7 13 132
7 15 161
8 0 278
8 2 199
8 3 280
8 4 359
8 5 20
8 6 335
8 7 182
8 9 108
8 10 112
8 11 344
8 12 192
8 13 264
8 14 207
8 15 231
9 1 256
9 2 67
9 3 185
9 4 341
9 5 270
9 6 353
9 7 327
9 8 108
9 10 395
9 11 205
9 12 365
9 13 8
9 14 57
9 15 132
10 0 190
10 2 390
10 3 66
10 4 211
10 5 210
10 6 12
10 7 272
10 8 112
10 9 395
10 11 11
10 12 7
10 13 288
10 14 143
10 15 226
11 0 213
11 1 188
11 3 65
11 4 367
11 5 369
11 6 307
11 7 198
11 8 344
11 9 205
11 10 11
11 12 203
11 13 136
11 14 252
11 15 168
12 0 55
12 1 149
12 2 312
12 4 340
12 5 131
12 6 199
12 7 103
12 8 192
12 9 365
12 10 7
12 11 203
12 13 90
12 14 344
12 15 11
13 0 239
13 1 330
13 2 3
13 3 274
13 4 14
13 5 133
13 6 273
13 7 132
13 8 264
13 9 8
13 10 288
13 11 136
13 12 90
13 14 39
13 15 39
14 0 321
14 1 17
14 2 237
14 3 72
14 4 69
14 6 118
14 8 207
14 9 57
14 10 143
14 11 252
14 12 344
14 13 39
14 15 154
15 0 162
15 1 370
15 2 96
15 3 282
15 4 128
15 5 167
15 7 161
15 8 231
15 9 132
15 10 226
15 11 168
15 12 11
15 13 39
15 14 154

最佳答案

您的段错误是因为您试图读取 main 的参数 vector 中不存在的索引。如果你想避免这种情况,你应该重写它以匹配如下内容:

int main (int argc, const char *argv[]) {

    if (argc > 1 && (number_threads = atoi(argv[1]))) {
        max_nodes = 0;
        readAdjMatrix();
    }

    return 0;
}

这确保您有一个要转换的参数,并且它是一个非零数字。我相信如果 atoi 不是有效的字符串,它就会有未定义的行为,所以你应该加强反对。你还做了一些其他不必要的事情。首先,这个 block 在这里:

   for(int i = 0 ; i < MAX_VERTICES ; i++){
        for(int j = 0 ; j < MAX_VERTICES ; j++){
            global_adj_matrix[i][j] = 0;
        }
    }

是没有意义的,因为如果您将二维数组初始化为外部/全局变量,那么它会在初始化时自动归零。只有本地/自动变量才会被垃圾数据填充。因此,您可以省略它。

最后,我还会更改您的 while 循环,使其看起来或多或少像这样(来源:Chux 以获得更好的循环保护)。

while(fscanf(file_pointer, "%d %d %d", &source, &destination, &edge_weight) == 3) {

    global_adj_matrix[source][destination] = global_adj_matrix[destination][source] = edge_weight;

    if(edge_weight > max_weight)
        max_weight = edge_weight;

    if(destination > max_nodes)
        max_nodes = destination;
}

这可确保您正确扫描每行所需的变量数量。而且扩展分配只是节省了一些空间。

希望这能解决您遇到的问题。

关于c - 段错误: Reading values from a text file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43579772/

相关文章:

c - 这在 C/C++ 套接字通信中是否合理?

c++ - 将 imagemagick blob 保存到 Node 缓冲区

c - pthread 导致的段错误?

c - C编程中的两人猜谜游戏

C:分配结构体的二维数组

c - 如何修复 PrintUIEntry 返回错误代码 2

c - 在 C 中删除整个链表 - 为什么不使用引用指针?

C 将 char append 到 char*

c++ - 输入函数时的 SIGSEGV

c - 为什么我的按位除法函数会产生段错误?