HCTF 2018WarmUp 1

一上来便是一张天真无邪的笑脸

使用C语言实现栈

说明

  • 作为栈顶的节点不存储数据

使用C语言实现链表

第一步:定义相应结构

由于实现链表的编程语言为C,不能够使用类,故使用结构来实现链表中的节点;

1
2
3
4
5
typedef struct LinkList {
char name[MAX_INPUT];
long number;
LinkList* next;
}Link;

该结构由一个字符数组,一项编号和一个指向此结构的指针组成。

第二步:定义输入函数

为了更容易、更准确的获取输入,在程序中重新定义输入函数,在原有fgets()函数的基础上略作修改,得到新的输入函数s_gets();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char* s_gets(char* st, int n) {
char* ret_val;
char* find;
ret_val = fgets(st, n, stdin);
if (ret_val) {
find = strchr(st, '\n');
if (find) {
*find = '\0';
}
else {
while (getchar() != '\n') {
continue;
}
}
}
return ret_val;
}

该函数为返回类型为字符指针、接受参数为一个字符指针和一个整数的输入函数,其中字符指针就是字符数组名称,因为数组名称本质上就是数组首元素的地址,而该数组为字符数组,故该字符数组名称本质上就是字符指针;

在函数内部,我声明了两个字符指针,一个用来接受fgets函数的返回值,一个用来接受查找字符函数(strchr)的返回值;

关于fgets()函数:

  • 如果接受输入的字符数量超过字符数组的大小(MAX_INPUT),fgets()函数会返回先前传入的地址,即字符数组的名称,并且把末尾的字符换为空字符('\0'),使之成为一个字符串;
  • 如果接收输入的字符数量在字符数组的大小以内,那么fgets()函数会将空字符放置在换行符之前,然后同样返回先前传入的地址;
  • 需要注意的是:fgets()函数在遇到文件结尾(EOF End Of File)时将会返回一个空指针;

关于strchr()函数:

  • 在某个字符数组中查找某字符,并返回指向该字符的指针
  • r如果字符串中不包含该字符,则返回一个空指针

经过重写,修改如下:

首先使用fgets()函数接收输入,并将返回值存储在指针ret_val中,然后对该指针进行判断,如果不为空指针,则使用字符查找函数查找换行符,并将该换行符替换为空字符,如果查找换行符失败,说明输入的字符数量超过了字符数组的大小,这时使用一个while循环接收其余的输入并抛弃;如果ret_val为空指针,说明遇到文件结尾;最后返回ret_val;

第三步:编写主函数进行测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int main() {
char input[MAX_INPUT];
Link* p = (Link*)malloc(sizeof(Link*));
Link* temp = p;
printf("Now start recording: \n");
printf("Name : ");
while (s_gets(input,MAX_INPUT) != NULL && input[0] != '\0') {
Link* a = (Link*)malloc(sizeof(Link));
a->next = NULL;
temp->next = a;
temp = temp->next;
strcpy(a->name, input);
printf("Number: ");
scanf("%ld", &(a->number));
getchar();
printf("Name : ");
}
temp = p->next;
printf("Recorded Data: \n");
while (temp) {
printf("Name: %s\tNumber: %ld\n", temp->name, temp->number);
temp = temp->next;
}
return 0;
}
  • 首先声明一个字符数组用来储存输入,然后声明一个节点类型的指针作为头节点,并为其分配内存,接着再声明一个同样的临时指针指向该头指针,这里使用临时指针的目的是作为当前指针与下一个指针的过渡指针,同时保持头指针指向的内容不变,方便最后的输出;
  • 在输出提示信息之后进入循环,退出条件为输入空行;在循环中,首先声明指向当前节点的指针并为其分配内存,接着将该指针指向的结构中的指针声明为NULL,然后将当前节点的指针赋给临时指针指向的结构的指针,使其与上一个节点相连,然后再将临时指针指向的指针赋给自身(其实就相当于使临时指针指向下一个节点);接着将刚刚接收的输入复制到当前节点的name变量中,然后再接收编号的输入并存储到当前节点的number变量中;值得注意的是,在使用scanf()函数接收输入后该函数似乎会将换行符留在缓存区中,所以这里需要使用getchar()函数来将该换行符从缓存区中去除;
  • 在循环结束之后,我将临时指针指向了头节点的下一个节点(请注意,头节点中并没有储存除下一个节点的地址之外的任何信息,故此处从头节点的下一个节点开始);然后进入下一个while循环,退出条件为临时指针为空指针(因为在上一个while循环中已经将当前节点中的指针声明为NULL了,所以一旦第一个循环结束,最后一个节点中的指针必为NULL),然后打印出当前节点的信息并将临时指针指向下一个节点。

源代码

最后附上源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX_INPUT 20

char* s_gets(char* st, int n);

char* s_gets(char* st, int n) {
char* ret_val;
char* find;
ret_val = fgets(st, n, stdin);
if (ret_val) {
find = strchr(st, '\n');
if (find) {
*find = '\0';
}
else {
while (getchar() != '\n') {
continue;
}
}
}
return ret_val;
}

typedef struct LinkList {
char name[MAX_INPUT];
long number;
LinkList* next;
}Link;

int main() {
char input[MAX_INPUT];
Link* p = (Link*)malloc(sizeof(Link*));
Link* temp = p;
printf("Now start recording: \n");
printf("Name : ");
while (s_gets(input,MAX_INPUT) != NULL && input[0] != '\0') {
Link* a = (Link*)malloc(sizeof(Link));
a->next = NULL;
temp->next = a;
temp = temp->next;
strcpy(a->name, input);
printf("Number: ");
scanf("%ld", &(a->number));
getchar();
printf("Name : ");
}
temp = p->next;
printf("Recorded Data: \n");
while (temp) {
printf("Name: %s\tNumber: %ld\n", temp->name, temp->number);
temp = temp->next;
}
return 0;
}

用Python编写一个能将图片转换为字符画的程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
\# -*- coding=utf-8 -*- 

from PIL import Image

import argparse #命令行输入参数处理



parser = argparse.ArgumentParser()

parser.add_argument('file') #输入文件

parser.add_argument('-o', '--output') #输出文件

parser.add_argument('--width', type = int, default = 80) #输出字符画宽

parser.add_argument('--height', type = int, default = 80) #输出字符画高 #获取参数



args = parser.parse_args()

IMG = args.file

WIDTH = args.width

HEIGHT = args.height

OUTPUT = args.output



ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^'. ") # 将256灰度映射到70个字符上



def get_char(r,g,b,alpha = 256):

if alpha == 0:

return ' '

​ length = len(ascii_char)

​ gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)

​ unit = (256.0 + 1)/length

return ascii_char[int(gray/unit)]



if __name__ == '__main__':

​ im = Image.open(IMG)

​ im = im.resize((WIDTH,HEIGHT), Image.NEAREST)

​ txt = ""

for i in range(HEIGHT):

for j in range(WIDTH):

​ txt += get_char(*im.getpixel((j,i)))

​ txt += '\n'

print(txt) #字符画输出到文件

if OUTPUT:

​ with open(OUTPUT,'w') as f:

​ f.write(txt)

else:

​ with open("output.txt",'w') as f:

​ f.write(txt)

人工智能入门-查找

概述

众所周知,人工智能在近些年十分火爆,在各个领域的应用也是十分广泛,其中一个领域就是导航。

来自班级组织演讲的一篇演讲稿

正文

地狱空荡荡 恶魔在人间

想必在座各位多少看过这句话,这就是我今天要说的有关Telegram N号房事件的一些东西;由于案情复杂,我就不再赘述,有兴趣的请自行百度
主要人物介绍:

Linux下利用命令行对U盘和电脑中的文件进行操作

1
2
3
4
5
6
fdisk -l			#查看接入设备名称
mount /dev/sda1 /mnt #挂载U盘
ls /mnt #查看U盘文件
cp file directory #复制指定文件file至指定目录directory
ls /mnt #再次查看U盘文件
umount /mnt #卸载U盘

标题(可选)

提示:
若操作中出现错误,请查看权限是否正确,或在每次操作前加’sudo’
cp后的文件和路径需带路径(个人推荐绝对路径)

Markdown_Editor V1.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
\# -*- coding=utf-8 -*- 
import tkinter
import os
from tkinter import filedialog

win_size='450x550'
win = tkinter.Tk()
win.geometry(win_size)

win.title('Markdown Editor V1.0 (hexo only)')

def processandsave():
contents = '---\ntitle:' + title.get('0.0','end') + 'tags:' + tags.get('0.0','end') + '---\n' + content.get('0.0','end')
filename = filedialog.asksaveasfilename()
if filename is not None:
with open(file=filename,mode='w') as file:
file.write(str(contents))
title.delete('0.0','end')
tags.delete('0.0','end')
content.delete('0.0','end')

def add_bash():
add_content=add_bash_text.get('0.0','end')
add_content=add_content.rstrip()
changing_content='```bash\n'+add_content+'\n```\n'
content.insert('end',changing_content)
add_bash_text.delete('0.0','end')

label1=tkinter.Label(text='标题',padx=10,pady=10)
label1.grid(row=0,column=0)

title=tkinter.Text(width=40,height=2)
title.grid(row=0,column=1,columnspan=2)

label2=tkinter.Label(text='标签',padx=5,pady=5)
label2.grid(row=1,column=0)

tags=tkinter.Text(width=30,height=1)
tags.grid(row=1,column=1)

label3=tkinter.Label(text='正文',padx=5,pady=5)
label3.grid(row=2,column=0)

content=tkinter.Text(width=40,height=20)
content.grid(row=2,column=1,rowspan=5)

add_bash_button=tkinter.Button(win,text='命令行',command=add_bash)
add_bash_button.grid(row=9,column=0)

add_bash_text=tkinter.Text(width=40,height=5)
add_bash_text.grid(row=9,column=1)

save_button=tkinter.Button(win,text='保存',command=processandsave)
save_button.grid(row=8,column=1)

win.mainloop()

Thanksgiving

arknights_20201128

HTML笔记

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
1 <h1> to </h6>: 一到六号标题
2 <p>段落</p>
3 <body style="background-color:PowderBlue;">
<p style="font-family:verdana;color:red">对段落样式进行修改</p>
</body>
4 <br /><hr /><!这是注释,前面的是换行和分割线>
5 <b>被加粗的内容</b>
6 <strong>被...加粗的内容...吧</strong>
7 <big>被加大的内容</big>
8 <em>被强调(加斜)的内容</em>
9 <i>被...意大利式加斜的内容</i>
10 <small>被减小的内容</small>
11 <sub>位于右下角的小字部分</sub>
12 <sup>位于右上角的小字部分</sup>
13 <pre>预格式文本(保留了空格和换行)</pre>
14 <code>用于</code>,<kbd>显示</kbd>,<samp>代码</samp>,<var>这个加大加粗了一点</var>
15 <address>用于书写地址,其中记得手动添加换行标签</address>
16 <abbr title="etcetera">etc.</abbr>
17 <acronym title="World Wide Web">WWW</acronym>
18 <bdo dir="rtl">印打序倒</bdo>
19 <blockquote>块引用</blockquote>,<q>短引用</q>
20 <p>你看<del>我被划掉了</del><ins>又被加下划线了</ins></p>
21 <a name="tips">基本的注意事项 - 有用的提示</a> <a href="#tips">有用的提示</a>
22 <img src="url" width=xx height=xx align=xxx />
23 <table border="1">
<tr>
<th>Heading</th>
<th>Another Heading</th>
</tr>
<tr>
<td>row 1, cell 1</td>
<td>row 1, cell 2</td>
</tr>
<tr>
<td>row 2, cell 1</td>
<td>row 2, cell 2</td>
</tr>
</table>
24 <ul><!unsorted list>
<li>Coffee</li>
<li>Milk</li>
</ul>
25 <ol><!ordered list>
<li>Coffee</li>
<li>Milk</li>
</ol>
26 <dl><!defined list>
<dt>Coffee</dt>
<dd>Black hot drink</dd>
<dt>Milk</dt>
<dd>White cold drink</dd>
</dl>
27 <head>
<style>
.cities {
background-color:black;
color:white;
margin:20px;
padding:20px;
}
</style>
</head>
28 <!DOCTYPE html>
<html>
<head>
<style>
span.red {color:red;}
</style>
</head>
<body>

<h1>My <span class="red">Important</span> Heading</h1>

</body>
</html>
29 <iframe src="demo_iframe.htm" width="200" height="200"></iframe>
30 <body background="http://www.w3school.com.cn/clouds.gif">
31 <script type="text/javascript">
document.write("Hello World!")
</script>
<noscript>Your browser does not support JavaScript!</noscript>

Quick Search