我应该将fp
复制到行。
我首先在fp
找到文本的长度
然后我使用fgets
动态分配行并检索文本。
我一直在自动评分机上得到“Your return code was -11 but it was supposed to be 0
”。这当然只是代码的一部分。我有一个makefile和main。
我的seg故障在哪里?
void read_lines(FILE* fp, char*** lines, int* num_lines){
int num_chars=0;
int index=0;
int lengths[index];
int i=0;
//find the length of the rows n cols in fp
//while there is still character in the text
while(!feof(fp)){
//get that character
char current_char= fgetc(fp);
//implement the number character
num_chars++;
//enter at the end of the first then each line
if(current_char=='\n'){
//find the length of the next line of sentence/word.
// This array stores the length of characters of each line
lengths[index]= num_chars;
//update index
index++;
// Reset the number of characters for next iteration
num_chars = 0;
// Increment the number of lines read so far
(*num_lines)++;
}
}
//now we need to copy the characters in fp to lines
(*lines)=(char**) malloc((*num_lines)*sizeof(char*));
for(i=0;i<*num_lines;i++){
(*lines)[i]=(char*)malloc(lengths[i]*sizeof(char));
fgets(*lines[i],(lengths[i]+1),fp);
fseek(fp,0,SEEK_SET);
}
}
答案 0 :(得分:0)
我在这里看到两个问题。
首先,长度静态分配零字节。这可以而且永远不会奏效。您需要创建一个具有最大大小(例如,最多256行)的长度数组,或者将长度设置为链接列表,以便它可以随索引一起增长。或者,您可以在文件中进行两次传递 - 一次获取行数(在此之后分配行数组),一次获取每行的字符数。
其次,虽然它是一个挑剔,但你可以通过从while循环中删除num_lines来大大简化代码。在循环之后,只需设置
*num_lines = index;
答案 1 :(得分:0)
段错误的原因是你以错误的方式传递行指针
fgets(*lines[i],(lengths[i]+1),fp);
正确的方法是: -
fgets((*lines)[i],(lengths[i]+1),fp);
答案 2 :(得分:0)
像这样修复
&#xA;&#xA; void read_lines(FILE * fp,char *** lines,int * num_lines){&#xA; int num_chars = 0;&#xA; / * int index = 0; int lengths [index]; // length [0]是坏的。 * /&#XA; int ch,i = 0,max_length = 0;&#xA;&#xA; while((ch = fgetc(fp))!= EOF){// while(!feof(fp)){很糟糕。因为它再次循环。&#xA; NUM_CHARS ++;&#XA; if(ch =='\ n'){&#xA; ++ i; // count line&#xA; if(num_chars&gt; max_length)&#xA; max_length = num_chars;&#xA; //重置&#XA; num_chars = 0;&#xA; }&#XA; }&#XA; if(num_chars!= 0)//最后一行没有换行&#xA; ++ I;&#XA; * num_lines = i;&#xA;&#xA;倒带(fp); //需要倒带&#xA; char * line = malloc(max_length + 1);&#xA; * lines = malloc(* num_lines * sizeof(char *));&#xA; for(i = 0; i&lt; * num_lines; i ++){&#xA; fgets(line,max_length + 1,fp);&#xA; (* lines)[i] = malloc(strlen(line)+1);&#xA; strcpy((* lines)[i],line);&#xA; }&#XA;自由(线);&#XA;}&#XA; 代码>
&#XA;