gpt4 book ai didi

c - C 中的 HTML 标签检查

转载 作者:太空宇宙 更新时间:2023-11-03 23:53:57 26 4
gpt4 key购买 nike

我正在用 C 编写一个小程序,用于检查 HTML 文件是否具有正确的打开和关闭标签?但我有一些问题......我有一个包含所有可能标签的文件,名为 tags.txt(这些只是第一个):

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

我有 htmlfile.html,我必须检查的内容:

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

其次,我想将这样的注释替换为 sysdate喜欢,格式没问题我可以做到,但是 prog 放入文件这

我的代码:

#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

最佳答案

您的代码非常复杂,有几个问题。

这是一个:

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

我相信这不会达到您的期望; sizeof(tags)不是tags的数组长度(声明为char tags[189][30];),它是变量的总大小。因此,此循环将从 0 到 189 * 30 - 1,即 5669,因此索引超出数组末尾。

此外,在这里以任何方式使用sizeof 的想法都是错误的,因为tags 的内容来自文件,因此编译器不可能知道。请记住,sizeof 是在编译时计算的,对于这些表达式。

您需要有一个变量(例如 size_t num_tags),您可以为从标签文件中解析的每一行递增该变量,稍后您可以使用该变量来遍历 tags

关于c - C 中的 HTML 标签检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13046704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com