【问题标题】:Segmentation fault in parsing解析中的分段错误
【发布时间】:2015-08-02 15:47:06
【问题描述】:

我正在尝试构建一个将 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 文件),然后复制后面的任何内容,直到程序到达 ' 块. <p>但是,当我运行程序时,会发生分段错误。</p>

【问题讨论】:

    标签: c parsing segmentation-fault


    【解决方案1】:

    在这一行: if(storage[i] = '&lt;' &amp;&amp; storage [i+1] = 't'){

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

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

    就目前而言,如果您使用[i+1] 索引超过BUFLEN 的大小,您将在为数组分配的内存之外读取。您还可以超过读取的字节数并检查未读取和/或未初始化的内容。

    【讨论】:

    • 对不起,我在复制代码时大惊小怪。我将重复条件更改为您所说的,但我仍然不断收到分段错误错误
    • 我会说,忘记 BUFLEN,它仅限制 fread() 读取的项目数。存储数组中读取字节数的唯一度量是 fread() 的返回值。如果标题恰好长于 2k 字节(这并不常见,被授予),则会出现另一个问题。访问storage[i+1] 必须通过检查i + 1 是否小于读取的项目数来保护
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-07-17
        • 2015-07-30
        • 2012-01-19
        • 2023-03-22
        • 1970-01-01
        • 2015-08-02
        • 1970-01-01
        • 2015-01-22
        • 1970-01-01
        相关资源
        最近更新 更多