我想打开一个文本文件(见下文),读取每行中的第一个int并将其存储在一个数组中,但是出现了分段错误。我去掉了所有的gcc警告,阅读了几篇在网上找到的教程,并搜索stackoverflow寻找解决方案,但我搞不清自己做错了什么。
当我在主函数中拥有所有内容时(参见示例1),它就工作了,但当我将它转移到第二个函数时就不工作了(参见下面的示例2)。在例2中,当我正确地解释gdb时,我得到sscanf (line,"%i",classes[i]);
处的seg故障。
恐怕,这可能是件小事,但我已经浪费了一天时间。
提前谢谢。
[例1]尽管这主要适用于所有方面:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int LENGTH = 1024;
int main() {
char *filename="somedatafile.txt";
int *classes;
int lines;
FILE *pfile = NULL;
char line[LENGTH];
pfile=fopen(filename,"r");
int numlines=0;
char *p;
while(fgets(line,LENGTH,pfile)){
numlines++;
}
rewind(pfile);
classes=(int *)malloc(numlines*sizeof(int));
if(classes == NULL){
printf("\nMemory error.");
exit(1);
}
int i=0;
while(fgets(line,LENGTH,pfile)){
printf("\n");
p = strtok (line," ");
p = strtok (NULL, ", ");
sscanf (line,"%i",&classes[i]);
i++;
}
fclose(pfile);
return 1;
}
[例2]这并不意味着将功能转换为功能:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int LENGTH = 1024;
void read_data(int **classes,int *lines, char *filename){
FILE *pfile = NULL;
char line[LENGTH];
pfile=fopen(filename,"r");
int numlines=0;
char *p;
while(fgets(line,LENGTH,pfile)){
numlines++;
}
rewind(pfile);
* classes=(int *)malloc(numlines*sizeof(int));
if(*classes == NULL){
printf("\nMemory error.");
exit(1);
}
int i=0;
while(fgets(line,LENGTH,pfile)){
printf("\n");
p = strtok (line," ");
p = strtok (NULL, ", ");
sscanf (line,"%i",classes[i]);
i++;
}
fclose(pfile);
*lines=numlines;
}
int main() {
char *filename="somedatafile.txt";
int *classes;
int lines;
read_data(&classes, &lines,filename) ;
for(int i=0;i<lines;i++){
printf("\nclasses[i]=%i",classes[i]);
}
return 1;
}
[somedatafile.txt的内容]
50 21 77 0 28 0 27 48 22 2
55 0 92 0 0 26 36 92 56 4
53 0 82 0 52 -5 29 30 2 1
37 0 76 0 28 18 40 48 8 1
37 0 79 0 34 -26 43 46 2 1
85 0 88 -4 6 1 3 83 80 5
56 0 81 0 -4 11 25 86 62 4
55 -1 95 -3 54 -4 40 41 2 1
53 8 77 0 28 0 23 48 24 4
37 0 101 -7 28 0 64 73 8 1
...
最佳答案
这:
sscanf (line,"%i",classes[i]);
可能是错的。你也需要取消引用,尝试:
sscanf (line,"%i", &(*classes)[i]);
这是因为
classes
是指向整数数组的指针。您需要其中一个整数的地址,以便sscanf()
可以在其中写入解析的数字。因此,必须先取消对classes
的引用才能获取数组,然后声明需要该数组中元素编号i
的地址。你也可以用
sscanf (line,"%i", *classes + i);
这可能更清楚,取决于你对这些事情有多舒服。
关于c - 由函数中的malloc和sscanf引起的seg错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2914766/