在 C 中从 CSV 文件(图形邻接列表)输入整数
Input integers from CSV file( graph adjacency list) in C
我正在尝试实施 BFS 算法以确定两个 nodes.For 之间的最短路径,我已将图形作为输入 csv 文件提供,这是邻接 list.I 计划存储此列表作为结构“rel”的数组并从 code.However 中显示的文件获取输入,输出未显示正确的值。
#include<stdlib.h>
#include<stdio.h>
typedef struct relation // to store the pair of integers in a csv file line (c connected to y
{
int x;
int y;
}rel; // relation
void split(char* buffer,char* string1,char* string2) // spilts buffer into two strings seperated by ,
{
char* buffer_trav = buffer; // trav ptr in buffer
char* string_trav = string1; // trav ptr to string 1 or 2(after ',' is read)
while(*buffer_trav!='[=10=]')
{
if(*buffer_trav==',')
{
string_trav = string2;
buffer_trav+=1;
}
else
{
*string_trav = *buffer_trav;
string_trav+=1;
buffer_trav+=1;
}
}
}
int main(void)
{
FILE* fp = fopen("graph.csv","r"); // reading csv file
int max_number_data = 100; // maximum number of edge relations in the file
rel graph[max_number_data];
for(int i=0;i<max_number_data;i++)
{
graph[i].x=1 ;
graph[i].y=-1 ; // setting initial value to be used as a check point for other functions
}
char buffer[10];//buffer for input
char x_buffer[5];// buffer for name
char y_buffer[5]; // buffer for password
int count=0;
while(fgets(buffer,10,fp)!=NULL)
{
char* ptr; // to be used to convert string to integer;
split(buffer,x_buffer,y_buffer); // splits into two strings
printf("%s : %s;\n",x_buffer,y_buffer); // To debug
graph[count].x = (int)strtol(x_buffer,&ptr,10); // converts string to longint which is later cat into int
graph[count].y = (int)strtol(y_buffer,&ptr,10); // " " " " " " " " " " " " "" " " " " "" " "" "" " " ""
count++;
}
fclose(fp);
}
输入文件:
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0,10
0,11
0,12
0,13
0,17
0,19
0,21
0,31
1,0
1,2
1,3
1,7
1,13
1,17
1,19
1,21
1,30
2,0
2,1
2,3
2,7
2,8
2,9
2,13
2,27
2,28
2,32
3,0
3,1
3,2
3,7
3,12
3,13
4,0
4,6
4,10
5,0
5,6
5,10
5,16
6,0
6,4
6,5
6,16
7,0
7,1
7,2
7,3
8,0
8,2
8,30
8,32
8,33
9,2
9,33
10,0
10,4
10,5
11,0
12,0
12,3
13,0
13,1
13,2
13,3
13,33
14,32
14,33
15,32
15,33
16,5
16,6
17,0
17,1
18,32
18,33
19,0
19,1
19,33
20,32
20,33
21,0
21,1
22,32
22,33
23,25
23,27
23,29
23,32
23,33
24,25
24,27
24,31
25,23
25,24
25,31
26,29
26,33
27,2
27,23
27,24
27,33
28,2
28,31
28,33
29,23
29,26
29,32
29,33
30,1
30,8
30,32
30,33
31,0
31,24
31,25
31,28
31,32
31,33
32,2
32,8
32,14
32,15
32,18
32,20
32,22
32,23
32,29
32,30
32,31
32,33
33,8
33,9
33,13
33,14
33,15
33,18
33,19
33,20
33,22
33,23
33,26
33,27
33,28
33,29
33,30
33,31
33,32
我得到的输出(调试)是:
0`@?d : 1
;
0`@?d : 2
;
0`@?d : 3
;
0`@?d : 4
;
0`@?d : 5
;
0`@?d : 6
;
0`@?d : 7
;
0`@?d : 8
;
0`@?d : 10
;
0`@?d : 11
;
0`@?d : 12
;
0`@?d : 13
;
0`@?d : 17
;
0`@?d : 19
;
0`@?d : 21
;
0`@?d : 31
;
1`@?d : 0
;
1`@?d : 2
;
1`@?d : 3
;
1`@?d : 7
;
1`@?d : 13
;
1`@?d : 17
;
1`@?d : 19
;
1`@?d : 21
;
1`@?d : 30
;
2`@?d : 0
;
2`@?d : 1
;
2`@?d : 3
;
2`@?d : 7
;
2`@?d : 8
;
2`@?d : 9
;
2`@?d : 13
;
2`@?d : 27
;
2`@?d : 28
;
2`@?d : 32
;
3`@?d : 0
;
3`@?d : 1
;
3`@?d : 2
;
3`@?d : 7
;
3`@?d : 12
;
3`@?d : 13
;
4`@?d : 0
;
4`@?d : 6
;
4`@?d : 10
;
5`@?d : 0
;
5`@?d : 6
;
5`@?d : 10
;
5`@?d : 16
;
6`@?d : 0
;
6`@?d : 4
;
6`@?d : 5
;
6`@?d : 16
;
7`@?d : 0
;
7`@?d : 1
;
7`@?d : 2
;
7`@?d : 3
;
8`@?d : 0
;
8`@?d : 2
;
8`@?d : 30
;
8`@?d : 32
;
8`@?d : 33
;
9`@?d : 2
;
9`@?d : 33
;
10@?d : 0
;
10@?d : 4
;
10@?d : 5
;
11@?d : 0
;
12@?d : 0
;
12@?d : 3
;
13@?d : 0
;
13@?d : 1
;
13@?d : 2
;
13@?d : 3
;
13@?d : 33
;
14@?d : 32
;
14@?d : 33
;
15@?d : 32
;
15@?d : 33
;
16@?d : 5
;
16@?d : 6
;
17@?d : 0
;
17@?d : 1
;
18@?d : 32
;
18@?d : 33
;
19@?d : 0
;
19@?d : 1
;
19@?d : 33
;
20@?d : 32
;
20@?d : 33
;
21@?d : 0
;
21@?d : 1
;
22@?d : 32
;
22@?d : 33
;
23@?d : 25
;
23@?d : 27
;
23@?d : 29
;
23@?d : 32
;
23@?d : 33
;
24@?d : 25
;
24@?d : 27
;
24@?d : 31
;
25@?d : 23
;
25@?d : 24
;
zsh: segmentation fault ./a.out
问题是字符串没有以 null 终止 characters.Also,出现分段错误是因为 csv 文件有大约 200 行,我将最大输入行设置为 100。
我正在尝试实施 BFS 算法以确定两个 nodes.For 之间的最短路径,我已将图形作为输入 csv 文件提供,这是邻接 list.I 计划存储此列表作为结构“rel”的数组并从 code.However 中显示的文件获取输入,输出未显示正确的值。
#include<stdlib.h>
#include<stdio.h>
typedef struct relation // to store the pair of integers in a csv file line (c connected to y
{
int x;
int y;
}rel; // relation
void split(char* buffer,char* string1,char* string2) // spilts buffer into two strings seperated by ,
{
char* buffer_trav = buffer; // trav ptr in buffer
char* string_trav = string1; // trav ptr to string 1 or 2(after ',' is read)
while(*buffer_trav!='[=10=]')
{
if(*buffer_trav==',')
{
string_trav = string2;
buffer_trav+=1;
}
else
{
*string_trav = *buffer_trav;
string_trav+=1;
buffer_trav+=1;
}
}
}
int main(void)
{
FILE* fp = fopen("graph.csv","r"); // reading csv file
int max_number_data = 100; // maximum number of edge relations in the file
rel graph[max_number_data];
for(int i=0;i<max_number_data;i++)
{
graph[i].x=1 ;
graph[i].y=-1 ; // setting initial value to be used as a check point for other functions
}
char buffer[10];//buffer for input
char x_buffer[5];// buffer for name
char y_buffer[5]; // buffer for password
int count=0;
while(fgets(buffer,10,fp)!=NULL)
{
char* ptr; // to be used to convert string to integer;
split(buffer,x_buffer,y_buffer); // splits into two strings
printf("%s : %s;\n",x_buffer,y_buffer); // To debug
graph[count].x = (int)strtol(x_buffer,&ptr,10); // converts string to longint which is later cat into int
graph[count].y = (int)strtol(y_buffer,&ptr,10); // " " " " " " " " " " " " "" " " " " "" " "" "" " " ""
count++;
}
fclose(fp);
}
输入文件:
0,1
0,2
0,3
0,4
0,5
0,6
0,7
0,8
0,10
0,11
0,12
0,13
0,17
0,19
0,21
0,31
1,0
1,2
1,3
1,7
1,13
1,17
1,19
1,21
1,30
2,0
2,1
2,3
2,7
2,8
2,9
2,13
2,27
2,28
2,32
3,0
3,1
3,2
3,7
3,12
3,13
4,0
4,6
4,10
5,0
5,6
5,10
5,16
6,0
6,4
6,5
6,16
7,0
7,1
7,2
7,3
8,0
8,2
8,30
8,32
8,33
9,2
9,33
10,0
10,4
10,5
11,0
12,0
12,3
13,0
13,1
13,2
13,3
13,33
14,32
14,33
15,32
15,33
16,5
16,6
17,0
17,1
18,32
18,33
19,0
19,1
19,33
20,32
20,33
21,0
21,1
22,32
22,33
23,25
23,27
23,29
23,32
23,33
24,25
24,27
24,31
25,23
25,24
25,31
26,29
26,33
27,2
27,23
27,24
27,33
28,2
28,31
28,33
29,23
29,26
29,32
29,33
30,1
30,8
30,32
30,33
31,0
31,24
31,25
31,28
31,32
31,33
32,2
32,8
32,14
32,15
32,18
32,20
32,22
32,23
32,29
32,30
32,31
32,33
33,8
33,9
33,13
33,14
33,15
33,18
33,19
33,20
33,22
33,23
33,26
33,27
33,28
33,29
33,30
33,31
33,32
我得到的输出(调试)是:
0`@?d : 1
;
0`@?d : 2
;
0`@?d : 3
;
0`@?d : 4
;
0`@?d : 5
;
0`@?d : 6
;
0`@?d : 7
;
0`@?d : 8
;
0`@?d : 10
;
0`@?d : 11
;
0`@?d : 12
;
0`@?d : 13
;
0`@?d : 17
;
0`@?d : 19
;
0`@?d : 21
;
0`@?d : 31
;
1`@?d : 0
;
1`@?d : 2
;
1`@?d : 3
;
1`@?d : 7
;
1`@?d : 13
;
1`@?d : 17
;
1`@?d : 19
;
1`@?d : 21
;
1`@?d : 30
;
2`@?d : 0
;
2`@?d : 1
;
2`@?d : 3
;
2`@?d : 7
;
2`@?d : 8
;
2`@?d : 9
;
2`@?d : 13
;
2`@?d : 27
;
2`@?d : 28
;
2`@?d : 32
;
3`@?d : 0
;
3`@?d : 1
;
3`@?d : 2
;
3`@?d : 7
;
3`@?d : 12
;
3`@?d : 13
;
4`@?d : 0
;
4`@?d : 6
;
4`@?d : 10
;
5`@?d : 0
;
5`@?d : 6
;
5`@?d : 10
;
5`@?d : 16
;
6`@?d : 0
;
6`@?d : 4
;
6`@?d : 5
;
6`@?d : 16
;
7`@?d : 0
;
7`@?d : 1
;
7`@?d : 2
;
7`@?d : 3
;
8`@?d : 0
;
8`@?d : 2
;
8`@?d : 30
;
8`@?d : 32
;
8`@?d : 33
;
9`@?d : 2
;
9`@?d : 33
;
10@?d : 0
;
10@?d : 4
;
10@?d : 5
;
11@?d : 0
;
12@?d : 0
;
12@?d : 3
;
13@?d : 0
;
13@?d : 1
;
13@?d : 2
;
13@?d : 3
;
13@?d : 33
;
14@?d : 32
;
14@?d : 33
;
15@?d : 32
;
15@?d : 33
;
16@?d : 5
;
16@?d : 6
;
17@?d : 0
;
17@?d : 1
;
18@?d : 32
;
18@?d : 33
;
19@?d : 0
;
19@?d : 1
;
19@?d : 33
;
20@?d : 32
;
20@?d : 33
;
21@?d : 0
;
21@?d : 1
;
22@?d : 32
;
22@?d : 33
;
23@?d : 25
;
23@?d : 27
;
23@?d : 29
;
23@?d : 32
;
23@?d : 33
;
24@?d : 25
;
24@?d : 27
;
24@?d : 31
;
25@?d : 23
;
25@?d : 24
;
zsh: segmentation fault ./a.out
问题是字符串没有以 null 终止 characters.Also,出现分段错误是因为 csv 文件有大约 200 行,我将最大输入行设置为 100。