2021-2022蓝桥杯寒假集训训练 - 问题 G: HTML新の手 -图片收集者

传送门


HTML新手 - 图片收集者

时间限制:2秒
空间限制:1024M

之所以在CSDN的题解上添加“の”,是因为CSDN博客标题不让包含“新手”两个字??!


题目描述














鸿

西

—— 小T发现北化似乎没有HTML课程,于是就开启了她的HTML学习之路。


通过学习得知,只需要在html文件中输入

<img src="图片地址">

就能在浏览器中显示该地址对应的图片。

例如,在html文件中输入:

<img src="https://www.baidu.com/img/flexible/logo/pc/result.png">

则在浏览器中将会显示地址为https://www.baidu.com/img/flexible/logo/pc/result.png的图片,显示结果为:

2021-2022蓝桥杯寒假集训训练 - 问题 G: HTML新の手 -图片收集者

同理,在html文件中输入

<html>
    <body>
        <h1>LetMeFly</h1>
        <img src="https://letmefly.xyz" alt="First Img">

        <h1>La La La</h1>
        <img src="https://qkiller.xyz" height="80px">

        <br>
        <img src="https://diary.letmefly.xyz" width="66px" />
    </body>
</html>

则浏览器中将会显示三张图片,图片地址分别为https://letmefly.xyzhttps://qkiller.xyzhttps://diary.letmefly.xyz

(不考虑注释等特殊情况)也就是说,只要遇到<img src="???" ***>的情况,就认为发现了一张地址为???的图片,其中***代表其他字符。 请不要把本题想象地过于复杂。

作为一个图片收集爱好者,小T想要知道一个 规范的 html文件中,都包含哪些图片。


输入描述

输入是一个规范的html源文件,且满足:

  1. 文件中不包含注释

  2. 文件中不包含换行的<img>标签

  3. 图片地址均由双引号包括(没有单引号)

  4. 图片地址中不包含双引号

  5. 文件大小不超过2M,且包含不超过1000张图片

  6. 每张图片的地址长度小于1024


输出描述

输出给定html文件中有哪些图片。

第一行一个整数代表源文件中图片的数量n

接下来按顺序输出n行,第i行代表第i个图片的地址


样例一

输入

<html>
    <body>
        <h1>LetMeFly</h1>
        <img src="https://letmefly.xyz" alt="First Img">

        <h1>La La La</h1>
        <img src="https://qkiller.xyz" height="80px">

        <br>
        <img src="https://diary.letmefly.xyz" width="66px" />
    </body>
</html>

输出

3
https://letmefly.xyz
https://qkiller.xyz
https://diary.letmefly.xyz

题目分析

根据题目描述,没有比较复杂的标签的情况。

因此可以采用以下思路:

  1. 先找出所有的img标签的起止位置

    只要遇到了“<img”,我们就认为找到了一个img标签,之后找到其后的第一个“>”,即可分离出这个img标签(<img ****>)

  2. 对于这个img标签,我们只需要找到src属性

    对于一个找到的img标签,我们只需要在标签范围内寻找“src="”之后找到后其后的“"”,二者之间的部分就是图片的地址。


AC代码

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

char s[2 * 1024 * 1024 + 10]; // 输入文件最大2M

char img[1000][1024]; // 最多1000张图片,图片长度<1024(加上个\0正好≤1024)

int findImg4End(int begin) { // Find Img's End,从begin开始寻找img标签的结尾。(因为本题保证img标签不会换行,所以只要出现“<img ”,就可以认为出现了img标签,也就可以认为后面一定会出现闭合的“>”)
    while (s[begin] != '>')
        begin++;
    return begin;
}

int main() {
    int imgNum = 0;
    while (gets(s)) { // 因题目规定img标签不会跨行,因此一次分析一行即可
        int l = strlen(s);
        int analyze2 = 0; // Analyze to,分析到了哪一个字符
        while (analyze2 < l) {
            if (analyze2 + 4 < l && s[analyze2] == '<' && s[analyze2 + 1] == 'i' && s[analyze2 + 2] == 'm' && s[analyze2 + 3] == 'g' && s[analyze2 + 4] == ' ') { // 找到了一个img标签的开始
                int img4End = findImg4End(analyze2 + 5); // 找到一个img标签,范围[analyze2, img4End]
                // printf("img[%d, %d]\n", analyze2, img4End); //****
                int srcBegin = analyze2;
                while (!(s[srcBegin] == 's' && s[srcBegin + 1] == 'r' && s[srcBegin + 2] == 'c' && s[srcBegin + 3] == '=' && s[srcBegin + 4] == '"')) // 输入数据一定能找到
                    srcBegin++;
                srcBegin = srcBegin + 5; // “"”后面开始
                int srcEnd = srcBegin;
                while (s[srcEnd] != '"')
                    srcEnd++;
                // 图片地址的真正范围是 [srcBegin, srcEnd)
                // printf("src[%d, %d)\n", srcBegin, srcEnd); //****
                for (int loc = srcBegin; loc < srcEnd; loc++) {
                    img[imgNum][loc - srcBegin] = s[loc];
                }
                img[imgNum++][srcEnd] = '\0';
                analyze2 = img4End + 1;
            }
            else {
                analyze2++;
            }
        }
    }
    printf("%d\n", imgNum);
    for (int i = 0; i < imgNum; i++) {
        puts(img[i]);
    }
    return 0;
}

gcc.exe (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0 编译通过

原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/123068245

上一篇:nginx的基本操作


下一篇:vue中 vue.app main.js index.html三者之间的关系