1

こんにちは、あなたが私を助けてくれることを願っています。Web サイトのページ ソースをダウンロードし、それを html ファイルに保存するこのコードを (C で) 作成する必要があります (既に実行済みです)。次の部分は、保存された html ファイルを使用して、そのサイトからテキストを抽出することです。

私はこのアルゴリズムのステップを心に留めています:

以下を含む html ファイルがあるとします。

< ここに何か >< 開始 >< テキスト > こんにちは < テキスト > さようなら! <終了>

  1. "" 文字列を検索し、"" 文字列をスキップします。(これは strstr() で実装できます)
  2. "" の最初の ">" にポインターを設定します。(strchr()?? を使用)
  3. 文字列の次の文字が「<」であるかどうかを確認します: (空白は無視されます) a.) 「はい」の場合、ポインターを次の ">" に設定します。チェック(3)を繰り返します。b.) いいえの場合、次の "<" まで文字列を取得します。次に、大きな文字列に格納 (追加) します。
  4. 最後に、文字列を file.txt に保存したいと思います。(fwite? または fopen() のオプション a+)。

論理的には、これは正しいですよね?プログラミングの初心者として、私はいつもエラーが発生します。コードを書きましたが、常にセグメンテーション違反が発生します。

助けてください/コードの何が問題なのか教えてください: ダミー - 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));

文字列にポインターは必要ありませんが、char.

あなた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, "<");

最後の 2 行は、最初の 2 行を無駄にしています。定数文字列を変数に再割り当てします。次にsprintfに移動するとfinalString、string が定数であるため (および事前定義されたサイズ - 1 文字の静的メモリに格納されているため)、sig fault が発生します。

標準的な解析ライブラリを使用することをお勧めします。HTML は常に適切にフォーマットされているとは限らず、ネストされたタグが許可されていることに注意する必要があります。一部のテキストは無視する必要があります (内部scriptの 、styleタグなど)。

それでも自分でやりたい場合は、入力を調べて、タグ内にいるのか、これらの文字をスキップするのか、プレーンテキスト内にいるのかを追跡して、このテキストを 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 に答える