|C程序|字符或字符串更适合识别HTML标记吗



我正在为操作系统类做一些家庭作业,我很难理解如何编写必要的代码来列出每个HTML标记的用途。我不确定我是否应该在这部分使用charstring来告诉程序如何识别每个HTML标记的用途。我将显示任务后面跟着我迄今为止的代码,以防有人指出我可能需要在代码中更改的内容:

在本作业中,您将创建一个C程序,该程序几乎满足与您在作业2中创建的C++程序相同的所有要求。

任务#2:

在这个作业中,您将创建一个C++程序,该程序打印HTML文件中的HTML标记列表,然后是找到的标记总数。程序可以假设输入文件是一个格式正确的HTML文件,并且HTML标记在同一行开始和结束。

我不知道为什么我的教授会要求我使用feof((,如果这对C不起作用。每个标签名称应以大写字母打印,并用尖括号括起来(不带属性(。您的程序应能够识别您选择的至少十个不同的标签名称。如果您的程序检测到一个无法识别的标签名称,它将打印"未知HTML标记">作为目的。您的程序应假设标签名称的长度永远不会超过100个字符。

有关如何在C中读写字符以及如何处理字符串的帮助,请参阅identifierDemo.C文件。

完成detectTags函数的定义。在执行此操作时,请使用标准C函数getcharfeof(toupper((来读取和处理标准输入文件的内容。当函数检测到标记的开始时,将标记名称的字符存储在数组中,并将此数组传递给displayPurpose函数。当函数读取完整个HTML文件后,让它返回检测到的标记数。

完成displayPurpose函数的定义。通过打印标记参数的内容开始此功能。然后使用名为strncmp((的标准C函数将标记参数与if-else控件结构中的至少十个不同标记名称进行比较。如果找到匹配项,请让函数打印标记的含义。(将此含义包含在函数中的常量C字符串中。(如果找不到匹配项,请让函数打印"em";未知HTML标记"。

对预处理器指令和该文件中剩余的C代码不做任何其他更改。

的设计和实现约束

保持您的实现简单易懂。声明块顶部的所有变量。不使用动态内存分配(例如,malloc((calloc(((。不要使用或创建字符串标记化器。另外,不要逐行读取HTML文件。相反,如identifierDemo.c程序中所示,逐个字符地读取文件。(如上所示(除了此任务中要求的功能外,不向程序添加其他功能。遵循源代码示例中显示的编码标准和以前作业中给出的编码标准。编辑:我已经修复了我的代码,但现在我意识到我需要弄清楚如何判断何时到达一个html标记的末尾,这样我才能转到另一个。**这是我一直在处理的代码:**

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#define TRUE  1
#define FALSE 0
#define LEFT_ANGLE_BRACKET '<'
#define RIGHT_ANGLE_BRACKET '>'
#define SPACE ' '
#define MAX_LENGTH 100
// Function Prototypes
int detectTags(void);
void displayPurpose(char *tag);

// #############################################################
int main(void)
{
int tagCount;
printf("n*** START OF HTML TAGS ***nn");
tagCount = detectTags();
printf("nTOTAL NUMBER OF HTML TAGS FOUND: %d n", tagCount);
return 0;
} // End main

// #############################################################
int detectTags(void)
{
char tag[10];
char tagElem;
int count = 0; // count of tags
do { //
for (int i = 0; i < 10; i++) {
scanf("%c", &tagElem);
tag[i] = tagElem; // add element to its place in the tag
count++; // increment count
}
} while(tagElem != '>'); 
do{
printf(&tagElem); // print tag character by character
} while(tagElem != '>'); // tag end condition
printf(">");
} // End detectTags

// #############################################################
void displayPurpose(char tag[])
{


int choice = 0;
if (tag == "<HTML>") {
choice = 1;
}
else if (tag == "<HEAD>") {
choice = 2;
}
else if (tag == "<TITLE>") {
choice = 3;
}
else if (tag == "</TITLE>") {
choice = 4;
}
else if (tag == "</HEAD>") {
choice = 5;
}
else if (tag == "<BODY>") {
choice = 6;
}
else if (tag == "<UL>") {
choice = 7;
}
else if (tag == "<P>") {
choice = 8;
}
else if (tag == "</UL>") {
choice = 9;
}
else if (tag == "</HTML>") {
choice = 10;
}

switch (choice) {
case (1) :
printf("Start of HTML file n");
break;

case (2) :
printf("Start of HTML header n");
break;

case (3) :
printf("Start of document title n");
break;

case (4) :
printf("End of document title n");
break;

case (5) :
printf("End of HTML header n");
break;

case (6) :
printf("Unknown HTML tag n");
break;

case (7) :
printf("Start of unnumbered list n");
break;

case (8) :
printf("Start of a new paragraph n");
break;

case (9) :
printf("End of unnumbered list n");
break;

case (10) :
printf("End of HTML file n");
break;

default :
printf("Unknown HTML tag n");
break;

}

} // End displayPurpose

我想我对教授完成这项任务的要求有一个合理的想法,但我想确定一下。这里有什么可以更改的地方来改进我的代码吗?

我想你在这里已经混淆了:C没有"字符串";数据类型。当人们在C中说字符串时,他们实际上指的是char数组。因此,与C++(它有一个名为std::string的类(不同,有char数组指针和char数组;它们的唯一区别是如何从中调用元素:*(arrPtr + eleIndex)表示指针,:arr[eleIndex]表示数组。C有很多降级为指针的东西,所以使用指针的方式是有目的的。

最新更新