解析中的分段错误

时间:2015-05-21 06:16:06

标签: c parsing segmentation-fault

我正在尝试构建一个将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;块。

但是,当我运行程序时,会发生分段错误。

3 个答案:

答案 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++。所以,你的循环继续运行并递增ji永不改变,直到你到达标题数组的末尾。然后你尝试访问标题数组没有的内存,然后出现你的Seg Fault。

答案 2 :(得分:1)

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

本地变量(包括数组)未初始化,其值为 indeterminate ,并且使用这些不确定的值会导致未定义的行为。在循环中使用条件storage[i]甚至可能导致您迭代出数组的边界。

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