1

美好的一天,我希望你能帮助我。我必须编写这段代码(用 C 语言)来下载网站的页面源并将其保存到 html 文件中(我已经这样做了)。下一部分是使用保存的 html 文件从该站点提取文本。

我脑子里有这个算法步骤:

假设我们有一个 html 文件,其中包含:

<这里的东西><开始><文本>你好<文本>再见!<结束>

  1. 找到“”字符串,跳过“”字符串。(这可以用 strstr() 来实现)
  2. 将指针设置为“”的第一个“>”。(使用 strchr()??)
  3. 检查字符串中的下一个字符是否为“<”:(忽略空格) a.) 如果是,则将指针设置为下一个“>”。重复检查 (3)。b.) 如果否,则获取字符串直到下一个“<”。然后将其存储(附加)到一个大字符串中。
  4. 最后,我想将字符串保存到 file.txt。(fwite?或 fopen() 中的选项 a+)。

从逻辑上讲,这是正确的,对吧?作为编程的初学者,我总是会出错。我写了一个代码,但它总是导致分段错误。

请帮助我/告诉我我的代码有什么问题:Dummy - 包含 html 代码的文件

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <time.h>

    int get_fileSize(FILE*);

    int main(){

        FILE *dummy = fopen("Dummy2","r");

        int filesize = get_fileSize(dummy);
        printf("Size of dummy = %d Bytes.\n", filesize);

        char *newString = (char*)malloc((sizeof(char*))*(filesize));

        if(dummy){
            fread(newString, sizeof(char*), filesize, dummy);
        }   

        char *tempString = (char*)malloc((sizeof(char*))*(filesize));
        char *finalString = (char*)malloc((sizeof(char*))*(filesize));
        finalString = "\0";

        tempString = strtok(newString, "<");
        do{

            //printf("%s\n",tempString);
            tempString = strtok(NULL, ">");

            if(tempString[1]!='<'){
                    sprintf(finalString,"%s%s",finalString,tempString);            
            }else continue;

        }while(*(newString++)!='\0');

        puts(finalString);

        return 0;
    }

    int get_fileSize(FILE *dummy){

        int size;
        struct stat file;
        fstat(fileno(dummy), &file);
        size = file.st_size;

        return size;

    }
4

3 回答 3

2

乍一看您的代码,第一个错误是您这样做sizeof(char*)了,而不仅仅是char

char *newString = (char*)malloc((sizeof(char*))*(filesize));

应该

char *newString = (char*)malloc((sizeof(char))*(filesize));

您不希望字符串中有指针,但是chars.

malloc在上面,从不打电话free(newString),这意味着你至少有 1 次泄漏,可能更多。

同样在这里:

fread(newString, sizeof(char*), filesize, dummy);

应该:

fread(newString, sizeof(char), filesize, dummy);


finalString = "\n"; //reassigns the pointer to another string, doesn't write into allocated memory.  

用于strcpy将字符串复制到分配的内存中。

于 2013-03-12T11:08:54.377 回答
1

您的代码中有一些错误,这些错误比 Tony The Lion 的回答中提到的更严重。考虑一下:

    char *tempString = (char*)malloc((sizeof(char*))*(filesize));
    char *finalString = (char*)malloc((sizeof(char*))*(filesize));
    finalString = "\0";
    tempString = strtok(newString, "<");

最后两行有效地使前两行无用。您将常量字符串重新分配给变量。当你然后sprintf到 时finalString,你会得到一个 sig 错误,因为字符串是常量(并且存储在具有预定义大小的静态内存中 - 1 个字符)。

我建议使用一些标准的解析库。您必须注意,HTML 的格式并不总是正确的,允许嵌套标签,必须忽略某些文本(例如 inside scriptstyle标签等)。

如果你仍然想自己做,你最好遍历输入,跟踪你是在标签内,跳过这些字符,还是在纯文本内,将此文本添加到你的 finalString 之类的东西中。

于 2013-03-12T11:22:06.527 回答
0

如果您正在获取文件大小,请使用它来控制循环(读取文件并不能保证在您读取的内容末尾会有一个零字节):

for (toggle = 0, i = 0; i < filesize; ++i) {
      if      (filearray[ i ] == '<')                toggle = 1;
      else if (filearray[ i ] == '>' && toggle != 0) toggle = 0;
      else if (!toggle) {
           printf("\nText char '%c' at %d", filearray[ i ], i);
      }
}
于 2013-03-12T13:31:26.637 回答