首页 > 解决方案 > |C程序| char 或 string 是否更适合识别 HTML 标签?

问题描述

我正在为我的操作系统课程做一些作业,但我无法理解如何编写必要的代码来列出每个 HTML 标记的用途。我不确定我是否应该在这部分使用charstring来告诉程序如何识别每个 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

我想我对教授对这项作业的要求有一个公平的想法,但我想确定一下。有什么,我可以改变以改进我的代码吗?

标签: htmlcstringchartags

解决方案


我认为您在这里感到困惑:C 没有“字符串”数据类型。当人们在 C 中说字符串时,他们实际上是指一个char数组。因此,与 C++(有一个名为 的类std::string)不同,有char数组指针和char数组;它们的唯一不同之处在于您如何从中调用元素:*(arrPtr + eleIndex)对于指针和:arr[eleIndex]对于数组。C有很多东西会退化为指针,所以使用指针的方式是有目的的。


推荐阅读