解析中的分段错误

Segmentation fault in parsing

我正在尝试构建将 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;
}

基本上,我要做的是在 html(已转换为 txt 文件)中查找 块,然后复制后面的内容,直到程序到达“<”,这表示 块。

但是,当我运行程序时,出现段错误。

在这一行中: if(storage[i] = '<' && storage [i+1] = 't'){

您正在分配 '<'storage[i]。将其更改为 if(storage[i] == '<' && storage [i+1] == 't'){ 以检查是否相等。

同样在 for(i=0; storage[i]; i++) 中,最好迭代直到 (<) 读取的字节数。 fread() returns 成功读取的元素数。如果未读取文件的内容,则您正在检查数组中未初始化的现有值。您应该使用 memset() 将数组初始化为 0。

按照目前的情况,如果您使用 [i+1] 索引超过 BUFLEN 的大小,您将读取数组分配的内存之外的内容。您还可以越过读取的字节数并检查未读取的内容 and/or 已初始化。

您的代码中有未定义的行为,更具体地说是循环中的条件storage[i]

局部变量,包括数组,没有被初始化,它们的值是不确定的,使用这些不确定的值会导致未定义的行为。在循环中使用条件 storage[i] 甚至可能导致迭代超出数组范围。

您需要使用 fread 的 return 值来知道读取了多少个字符,并将其用作循环中的上限。然后你必须考虑当 i 已经达到上限时 storage [i+1] 会发生什么。

所以我怀疑你的 Seg Fault 可能来自你最后一个 for 循环。

for( i=i+7; storage[i] != '<'; j++ ){ title[j] = storage[i]; }

您不会在此循环中更新 i 的值,因为如果您愿意,我相信它需要紧挨着 j++。因此,您的循环保持 运行 并递增 j,并且 i 永远不会改变,直到您到达标题数组的末尾。然后你尝试访问标题数组没有的内存,然后出现段错误。