我正在尝试构建一个将HTML转换为文本文件的代码。
#include <stdio.h>
#include <stdlib.h>
#define BUFLEN 2048
int main(){
FILE *fp;
fp = fopen("tc.txt", "r");
int i = 0;
int j = 0;
char storage[BUFLEN];
char title[100];
fread(storage, 1, sizeof(storage), fp);
for(i=0; storage[i]; i++){
if(storage[i] == '<' && storage [i+1] == 't'){
for(i=i+7; storage[i] != '<'; j++){
title[j] = storage[i];
}
}
}
puts(title);
fclose(fp);
return 0;
}
基本上我要做的是寻找&lt; title&gt;阻止html(转换为txt文件)然后复制之后的任何内容,直到程序到达'&lt;',这表示&lt; / title&gt;块。
但是,当我运行程序时,会发生分段错误。
答案 0 :(得分:2)
在这一行:
if(storage[i] = '<' && storage [i+1] = 't'){
您正在向'<'
致storage[i]
。将其更改为if(storage[i] == '<' && storage [i+1] == 't'){
以检查是否相等。
同样在for(i=0; storage[i]; i++)
中,最好迭代直到(<
)读取的字节数。 fread()返回成功读取的元素数。如果未读取文件的内容,则检查阵列中未初始化的现有值。您应该使用memset()
将数组初始化为0。
目前的情况是,如果您使用BUFLEN
索引超过[i+1]
的大小,您将在数组的已分配内存之外读取。您还可以超过读取的字节数并检查未读取和/或初始化的内容。
答案 1 :(得分:2)
所以我怀疑你的Seg Fault可能来自你的最后一个for循环。
for( i=i+7; storage[i] != '<'; j++ ){
title[j] = storage[i];
}
您不会在此循环中更新i
的值,因为如果您愿意,我相信它需要紧挨着j++
。所以,你的循环继续运行并递增j
,i
永不改变,直到你到达标题数组的末尾。然后你尝试访问标题数组没有的内存,然后出现你的Seg Fault。
答案 2 :(得分:1)
您的代码中有未定义的行为,更具体地说,是循环中的条件storage[i]
。
本地变量(包括数组)未初始化,其值为 indeterminate ,并且使用这些不确定的值会导致未定义的行为。在循环中使用条件storage[i]
甚至可能导致您迭代出数组的边界。
您需要使用fread
的返回值来了解读取的字符数,并将其用作循环的上限。然后,当storage [i+1]
已经达到上限时,你必须考虑i
会发生什么。