2

HTMLファイルに正しい開始タグと終了タグがあることを確認するために、Cで小さなプログラムを書いていますか? しかし、私はいくつかの問題を抱えています...私はtags.txtという名前のすべての可能なタグを含むファイルを持っています(これらは最初のものだけです):

<a>
</a>
<abbr>
</abbr>
<area>
</area>
<aside>
</aside>

そして、私はチェックしなければならないhtmlfile.htmlを持っています:

<!--#echo var="date" -->
<area>
</area>
<area>
</area>

第二に、このようなコメントを sysdate のように置き換えたいです。形式は問題ありませんが、プログラムはファイルにこれを入れます

私のコード:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

#define MAX_SIZE 512


void menu();
void check();
void datumos();


int main(int argc,char *argv[])
{
    menu();

    return 0;
}

void menu()
{
    char menu[MAX_SIZE];
    while(1 < 2)
    {
            printf("\npress a button:\n\n");

                    printf("\tFile HTML check..............:c\n");
                    printf("\t<!--#echo var="date" -->...........:d\n");
                    printf("\tExit:\tCTRL + C\n");
                    scanf("%s",menu);

            if( strcmp(menu,"c") == 0 )
            {
                    check();
            }
            else if( strcmp(menu,"d") == 0 )
            {
                    datumos();
            }

    }
}

void check()
{
    FILE *htmlfile;
    FILE *checkfile;

    htmlfile = fopen("htmlfile.html","w");
    checkfile = fopen("tags.txt","r");

char line[MAX_SIZE];
char htmlline[MAX_SIZE];
char tags[189][30];


int i=0;

printf("\tcheck__1\n");

while(fgets(line,sizeof(line),checkfile) != NULL)
    {

        int j;
    for(j=0; j<sizeof(line); ++j)
    {
        tags[i][j]=line[j];
    }
    ++i;

    }
printf("\tcheck__2\n");


int k=0;    char htmlfiletags[MAX_SIZE][30];
    while(fgets(htmlline,sizeof(htmlline),htmlfile) != NULL)
    {
    char currentline[sizeof(htmlline)];
    int j=0;

        if( currentline[j]=="<" )
        {

                while(currentline[j]!=">") 
                {
                    htmlfiletags[k][j]=currentline[j];
                    ++j;
                }
                strcat(htmlfiletags[k][j+1],">"); 
                ++k; 
        }
}
printf("\tcheck__3\n");


 int n;
 for(n=0; n<sizeof(htmlfiletags); ++n)
 {
     int j; int howmanytimesnot=0;

     for(j=0; j<sizeof(tags); ++j)
     {
         printf("\tcheck__3/1\n");


         if(strcmp(htmlfiletags[n],tags[j])==0)
         {
             printf("\t%d\n", howmanytimesnot);

             ++howmanytimesnot;
         }
     }

    printf("\tcheck__3/3\n");

     if(!(howmanytimesnot<sizeof(tags)))
        {
            printf("\tcheck__3/4\n");
          printf("the file is not wellformed");

          exit (1);
        }

 }
 printf("\tcheck__4\n");


}

void copy_file(const char *from,const char *to)
{
    FILE *fr;
    FILE *t;
    fr = fopen(from,"r");
    t = fopen(to,"w");

    char line[MAX_SIZE];

    char row[MAX_SIZE];

    while(fgets(line,sizeof(line),fr) != NULL)
    {
            sscanf(line,"%s",row);
            fprintf(t,"%s\n",row);
    }

    fclose(fr);
    fclose(t);

    remove("tempfile.html");
 }


void datumos()
{
time_t now = time(NULL);
struct tm *t = localtime(&now);
char date_time[30];
strftime( date_time, sizeof(date_time), "%x_%X", t );

FILE *htmlfile;
    FILE *tempfile;
    htmlfile = fopen("htmlfile.html","r");
    tempfile = fopen("tempfile.html","w");
    char line[MAX_SIZE];
    //char datecomment[]="<!--#echo var=date -->";

    while(fgets(line,sizeof(line),htmlfile) != NULL)
    {

            if( strcmp(line,"<!--#echo var="date" -->") == 0 )
            {

            char row[40];
            strcpy(row,"<!--");
            strcat(row, date_time);
            strcat(row,"-->");

    printf("%s",row);
            fputs(row,tempfile);

            }
            else
            {
                    fputs(line,tempfile);
            }
    }

    fclose(htmlfile);
    fclose(tempfile);

    copy_file("tempfile.html","htmlfile.html");

}

これで、内側のforループで、200回目のチェックでifで死ぬ...理由がわからない...

 int n;
 for(n=0; n<sizeof(htmlfiletags); ++n)
 {
     int j; int howmanytimesnot=0;

     for(j=0; j<sizeof(tags); ++j)
     {
         printf("\tcheck__3/1\n");


         if(strcmp(htmlfiletags[n],tags[j])==0)
         {
             printf("\t%d\n", howmanytimesnot);

             ++howmanytimesnot;
         }
     }

    printf("\tcheck__3/3\n");

     if(!(howmanytimesnot<sizeof(tags)))
        {
            printf("\tcheck__3/4\n");
          printf("the file is not wellformed");

          exit (1);
        }

 }

すべての返信をありがとう!! G

4

4 に答える 4

1

あなたのコードは非常に複雑で、いくつかの問題があります。

ここに1つあります:

for(j=0; j<sizeof(tags); ++j)

これはあなたが期待していると私が信じていることをしません。は( として宣言されている)sizeof(tags)の配列の長さではなく、変数の合計サイズです。したがって、このループは 0 から 189 * 30 - 1、つまり 5669 まで進み、配列の終わりを超えてインデックスを作成します。tagschar tags[189][30];

また、sizeofここで何らかの方法で使用するという考えは間違っています。なぜなら、 の内容はtagsファイルから来ているため、コンパイラが知ることができないからです。sizeofこのような式については、コンパイル時に評価されることを忘れないでください。

size_t num_tagsタグファイルから解析された行ごとにインクリメントし、後で反復処理に使用する変数 (例: ) が必要ですtags

于 2012-10-24T10:12:17.040 に答える
0
  • currentlineは必要ありません、そして私も比較を修正しました

    while(fgets(htmlline,sizeof(htmlline),htmlfile) != NULL)
    {           
        int j=0;
    
            if( htmlline[j]=='<' )
            {
    
                    while(htmlline[j]!='>')
                    {
                        htmlfiletags[k][j]=htmlline[j];
                        ++j;
                    }
                    strcat(htmlfiletags[k][j+1],">");
                    ++k;
            }
    }
    

-さらに、適切なコメントのみを置き換え、別のコメントを傷つけないようにする別の問題は、まだ機能しません

「だからそれは置き換えます

  <!--#echo var="date" --> to the sysdate, it's ok, but when there are different comments like

  <!--#include something -->, it wont be copied back well, in the htmlfile will be only <!--#include"

アイデア?

于 2012-10-25T20:47:05.867 に答える
0

いくつか修正しましたが、まだファイルの htmltags をチェックできず、同じループで停止します。tags 配列の割り当てを修正しました - htmlfile に 2 つ以上の異なるコメントがあり、コメントを置き換えている場合プログラムはそれをsysdateに置き換えますが、プログラムは=>のように別のコメントをひどくコピーします

コードは次のとおりです。

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <time.h>

    #define MAX_SIZE 512


    void menu();
    void check();
    void datumos();


    int main(int argc,char *argv[])
    {
        menu();

        return 0;
    }

    void menu()
    {
        char menu[MAX_SIZE];
        while(1 < 2)
        {
                printf("\npress a button:\n\n");

                        printf("\tFile HTML check..............:c\n");
                        printf("\t<!--#echo var="date" -->...........:d\n");
                        printf("\tExit:\tCTRL + C\n");
                        scanf("%s",menu);

                if( strcmp(menu,"c") == 0 )
                {
                        check();
                }
                else if( strcmp(menu,"d") == 0 )
                {
                        datumos();
                }

        }
    }

    void check()
    {
        FILE *htmlfile;
        FILE *checkfile;

        htmlfile = fopen("htmlfile.html","r");
        checkfile = fopen("tags.txt","r");

        char line[MAX_SIZE];
        char htmlline[MAX_SIZE];


        int i2=0;

        printf("\tcheck__1\n");
        while(fgets(line,sizeof(line),checkfile) != NULL)
        {
            ++i2;

        }


        char tags[i2][20];

        int i=0;

        printf("\tcheck__11\n");
        while(fgets(line,sizeof(line),checkfile) != NULL)
        {
            int j;
            for(j=0; j<sizeof(line); ++j)
            {

                tags[i][j]=line[j];
            }
            ++i;

        }
        printf("\tcheck__2\n");

        int k=0;    char htmlfiletags[MAX_SIZE][30];
        while(fgets(htmlline,sizeof(htmlline),htmlfile) != NULL)
        {
            char currentline[sizeof(htmlline)];
            int j=0;

                if( currentline[j]=="<" )
                {

                        while(currentline[j]!=">")
                        {
                            htmlfiletags[k][j]=currentline[j];
                            ++j;
                        }
                        strcat(htmlfiletags[k][j+1],">");
                        ++k;
                }
        }
        printf("\tcheck__3\n");

         int n;
         for(n=0; n<sizeof(htmlfiletags); ++n)
         {
             int j; int howmanytimesnot=0;

             for(j=0; j<sizeof(tags); ++j)
             {
                 //printf("\tcheck__3/1\n");

                 if(strcmp(htmlfiletags[n],tags[j])==0)
                 {
                   //  printf("\t%d\n", howmanytimesnot);
                     ++howmanytimesnot;
                 }
             }

            printf("\tcheck__3/3\n");

             if(!(howmanytimesnot<sizeof(tags)))
                {
                    printf("\tcheck__3/4\n");
                  printf("the file is not wellformed");

                  exit (1);
                }

         }
         printf("\tcheck__4\n");

    }

    void copy_file(const char *from,const char *to)
    {
        FILE *fr;
        FILE *t;
        fr = fopen(from,"r");
        t = fopen(to,"w");

        char line[MAX_SIZE];
        char row[MAX_SIZE];

        while(fgets(line,sizeof(line),fr) != NULL)
        {
            sscanf(line,"%s",row);
            fprintf(t,"%s\n",row);
        }

        fclose(fr);
        fclose(t);

        remove("tempfile.html");
    }


    void datumos()
    {
    time_t now = time(NULL);
    struct tm *t = localtime(&now);
    char date_time[30];
    strftime( date_time, sizeof(date_time), "%x_%X", t );

        FILE *htmlfile;
        FILE *tempfile;

        htmlfile = fopen("htmlfile.html","r");
        tempfile = fopen("tempfile.html","w");

        char line[MAX_SIZE];
        char* datecomment="<!--#echo var=\"date\" -->";

        while(fgets(line,sizeof(line),htmlfile) != NULL)
        {

            int i3; int db=0;
            for(i3=0; i3<strlen(datecomment); ++i3)
            {
                if(line[i3]==datecomment[i3])
                {
                    ++db;
                }

            }

            if(db==strlen(datecomment))
            {

            char row[30];
            strcpy(row,"<!--");
            strcat(row, date_time);
            strcat(row,"-->\n");

            fputs(row,tempfile);

            }
            else
            {
                fputs(line,tempfile);
            }

        }

        fclose(htmlfile);
        fclose(tempfile);

        copy_file("tempfile.html","htmlfile.html");

    }
于 2012-10-25T06:37:51.613 に答える
0

HTML の解析に regex や何らかの文字列解析を使用しないでください。代わりに、Webまたはこのサイトを検索して、html を解析するための ac ライブラリを探します。次に、解析された HTML ファイルでタグを確認します。これにより、ファイルを自分で解析する必要がないため、開発が大幅に容易になります。

于 2012-10-24T10:04:54.670 に答える