传送门
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的图片,显示结果为:
同理,在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.xyz、https://qkiller.xyz、https://diary.letmefly.xyz
(不考虑注释等特殊情况)也就是说,只要遇到<img src="???" ***>
的情况,就认为发现了一张地址为???
的图片,其中***
代表其他字符。 请不要把本题想象地过于复杂。
作为一个图片收集爱好者,小T想要知道一个 规范的 html文件中,都包含哪些图片。
输入描述
输入是一个规范的html源文件,且满足:
-
文件中不包含注释
-
文件中不包含换行的
<img>
标签 -
图片地址均由双引号包括(没有单引号)
-
图片地址中不包含双引号
-
文件大小不超过2M,且包含不超过1000张图片
-
每张图片的地址长度小于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
题目分析
根据题目描述,没有比较复杂的标签的情况。
因此可以采用以下思路:
先找出所有的
img
标签的起止位置只要遇到了“
<img
”,我们就认为找到了一个img
标签,之后找到其后的第一个“>
”,即可分离出这个img
标签(<img ****>
)对于这个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