html - |C程序| char 或 string 是否更适合识别 HTML 标签?
问题描述
我正在为我的操作系统课程做一些作业,但我无法理解如何编写必要的代码来列出每个 HTML 标记的用途。我不确定我是否应该在这部分使用char或string来告诉程序如何识别每个 HTML 标记的用途。我将展示我到目前为止的代码所遵循的任务,以防有人指出我可能需要在代码中更改的内容:
在本作业中,您将创建一个 C 程序,该程序几乎满足您在作业 #2 中创建的 C++ 程序的所有相同要求。
作业#2:
在本作业中,您将创建一个 C++ 程序,该程序打印 HTML 文件中的 HTML 标记列表,然后是找到的标记总数。该程序可能会假设输入文件是一个格式正确的 HTML 文件,并且 HTML 标记在同一行开始和结束。
我不确定为什么我的教授会要求我使用 feof() 如果这不适用于 C。每个标签名称都应以全部大写字母打印并用尖括号括起来(不带属性)。您的程序应该能够识别您选择的至少十个不同的标签名称。如果您的程序检测到它无法识别的标签名称,它将打印“Unknown HTML tag”作为目的。您的程序应假定标签名称永远不会超过 100 个字符。
有关如何在 C 中读取和写入字符以及如何处理字符串的帮助,请参阅 identifierDemo.c 文件。
完成detectTags函数的定义。为此,请使用标准 C 函数getchar()、feof()和toupper()来读取和处理标准输入文件的内容。当函数检测到标签的开始时,将标签名称的字符存储在一个数组中,并将该数组传递给displayPurpose函数。当函数读完整个 HTML 文件后,让它返回检测到的标签数量。
完成displayPurpose函数的定义。通过打印 tag 参数的内容来开始这个函数。然后使用名为strncmp()的标准 C 函数将标记参数与 if-else 控制结构中的至少十个不同标记名称进行比较。如果找到匹配项,则让函数打印标签的含义。(在函数的常量 C 字符串中包含此含义。)如果未找到匹配项,则让函数打印"Unknown HTML tag"。
不对预处理器指令或此文件中剩余的 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 ***\n\n");
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有很多东西会退化为指针,所以使用指针的方式是有目的的。