解析中的分段错误
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
永远不会改变,直到您到达标题数组的末尾。然后你尝试访问标题数组没有的内存,然后出现段错误。
我正在尝试构建将 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
永远不会改变,直到您到达标题数组的末尾。然后你尝试访问标题数组没有的内存,然后出现段错误。