首页
学习笔记
网站建设
闲聊杂谈
编程开发
友情链接
留言
用户登录
用户名
密码
登录
注册
关键词搜索
搜索
标签搜索
C/C++
开源框架
Linux
网络/安全
环境配置
生活随笔
开发实践
图形开发
DNS
近期浏览
热门文章
1
Joe主题懒人版
1.7k 阅读
2
Clion下使用EasyX图形库
231 阅读
3
解决学校教务系统无法创建对象
220 阅读
4
获取win11的操作系统信息
138 阅读
5
解决C语言IDE工具Clion各种问题
110 阅读
6
每日60S早报
101 阅读
7
VS code配置C/C++开发环境
99 阅读
8
生成随机且不重复的Uid: 方法与实现
95 阅读
9
C语言中的链表:定义、操作与实现
85 阅读
浅梦
累计撰写
24
篇文章
累计添加
9
个标签
累计收到
164
条评论
首页
分类
学习笔记
网站建设
闲聊杂谈
编程开发
页面
友情链接
留言
用户登录
登录
注册
科技疆界:编码生活
探索编程的无限可能,以创新和专业的眼光观察生活的每一个角落。在这里,我们热爱技术,享受生活,相信每个人都能在代码的世界中找到自己的故事。欢迎加入我们的科技疆界,一起走向未知的编程世界。
解决学校教务系统无法创建对象
问题描述 非IE浏览器打开并登录教务系统,提示无法创建对象,并且缺失很多功能,如信息查询功能,选课功能等 解决步骤 教程所用浏览器:edge 版本:110.0.1587.69 打开浏览器,点击右上角三个点 向下拉找到设置选项,点击进入 点击默认浏览器选项 如图设置 退出设置,登录教务系统,点击地址栏如图所示按钮 如图设置 完结撒花!!!
2023年03月14日
丨
220阅读
丨
2评论
学习笔记
深入了解C语言中的system()函数及其注意事项
C 语言中的 system() 函数是一个非常常用的函数,它可以让程序执行外部命令,实现与操作系统交互的功能。本文将详细介绍 system() 函数的用法及其注意事项。 函数原型 system() 函数的函数原型如下: int system(const char* command); 其中,参数 command 是一个字符串指针,指向需要执行的外部命令的命令字符串。函数返回值为 int 类型,表示命令执行结果的状态码。 函数功能 system() 函数的主要功能是执行指定的外部命令,并返回命令执行结果的状态码。系统调用外部命令通常需要使用 shell 或 cmd 等命令解释器,因此在执行外部命令时,系统会启动一个新的进程来执行命令。外部命令的执行结果状态码通常为 0 表示成功,其他值则表示失败或异常情况。 函数用法 使用 system() 函数执行外部命令的基本用法非常简单,只需要将需要执行的命令字符串作为参数传递给函数即可。下面是一个简单的例子: #include <stdlib.h> int main() { system("dir"); return 0; } 在上面的例子中,使用 system() 函数执行了一个命令字符串 "dir",该命令在 Windows 操作系统中用于列出当前目录下的文件和子目录列表。 除了直接传递命令字符串作为参数外,system() 函数还支持使用变量或表达式等动态生成命令字符串的方式。例如: #include <stdlib.h> #include <stdio.h> int main() { char filename[256] = "file.txt"; char command[512]; sprintf(command, "notepad %s", filename); system(command); return 0; } 在上面的例子中,使用 sprintf() 函数将需要执行的命令字符串动态生成并存储到一个字符数组 command 中,然后将该数组作为参数传递给 system() 函数执行。这里的命令字符串是 "notepad file.txt",表示启动记事本程序打开名为 file.txt 的文件。 除了执行外部命令外,system() 函数还可以用于实现一些其他功能,例如打开文件、启动程序等。下面是一个使用 system() 函数打开文件的例子: #include <stdlib.h> int main() { system("start notepad file.txt"); return 0; } 在上面的例子中,使用 system() 函数执行了一个命令字符串 "start notepad file.txt",该命令在 Windows 操作系统中用于打开记事本程序并打开名为 file.txt 的文件。 注意事项 使用 system() 函数需要注意一些安全性问题。由于 system() 函数可以执行任意的外部命令,因此如果命令字符串中包含用户输入的数据,就有可能存在命令注入等安全漏洞。例如,如果用户可以控制命令字符串,就可以通过输入 "; rm -rf /" 这样的命令字符串来删除整个文件系统。因此,在使用 system() 函数时,必须确保命令字符串来自可信的源,并且需要对命令字符串进行严格的输入验证和过滤。 此外,由于 system() 函数会启动一个新的进程执行外部命令,因此会占用一定的系统资源,并且可能会对程序的性能和安全性产生一定的影响。因此,在使用 system() 函数时,需要权衡利弊并慎重使用。 最后,需要注意的是,system() 函数的功能和使用方法在不同的操作系统中可能存在一定的差异。在使用 system() 函数时,需要根据不同的操作系统和命令解释器来适配相应的命令字符串,以确保函数能够正确执行外部命令。
2023年03月11日
丨
73阅读
丨
0评论
学习笔记
获取win11的操作系统信息
User-Agent字符串 User-Agent字符串是在HTTP协议中使用的一个标头,用于标识请求端的软件环境信息。它告诉服务器发送请求的客户端的操作系统、浏览器类型和版本、硬件平台等信息。 如果你想知道更多关于UA的信息可以看 浏览器野史 —— UserAgent 列传【转载】 - 沉默的博客 (cmsblog.cn) 那么有人就会问了,既然ua可以,告诉服务器发送请求的客户端的操作系统,那应该能够获取Win11的操作系统信息,然而事实却不是这样的,因为us各种历史原因下的产物,微软官方已经正式确定不会更新win11的UA信息,这意味着我们将无法通过UA获取到win11操作系统的信息 既然我们无法通过ua识别win11,那有没有其他办法呢?答案是:有! 使用User-Agent客户端提示检测Windows 11 在 Microsoft Edge (和 Google Chrome) 中,网站可以通过User-Agent客户端提示 (UA-CH) 来区分Windows 11用户和Windows 10用户。 可以在以下 UA-CH 请求标头中找到此信息: 标头字段 指示Windows 10的值 指示Windows 11的值 Sec-CH-UA-Platform Windows Windows Sec-CH-UA-Platform-Version 和 之间的 1.0.0 值 10.0.0 13.0.0 及更高版本 支持User-Agent客户端提示的浏览器 下表显示了哪些浏览器支持区分Windows 11和Windows 10。 浏览器 支持通过User-Agent客户端提示进行区分? Microsoft Edge 94+ 是 Chrome 95+ 是 Opera 是 Firefox 否 Internet Explorer 11 否 用于检测Windows 11的示例代码 以下代码检测Windows 11: navigator.userAgentData.getHighEntropyValues(["platformVersion"]) .then(ua => { if (navigator.userAgentData.platform === "Windows") { const majorPlatformVersion = parseInt(ua.platformVersion.split('.')[0]); if (majorPlatformVersion >= 13) { console.log("Windows 11 or later"); } else if (majorPlatformVersion > 0) { console.log("Windows 10"); } else { console.log("Before Windows 10"); } } else { console.log("Not running on Windows"); } }); 以上信息来自微软官方文档 我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=n5z8bvazsyzw
2023年02月13日
丨
138阅读
丨
2评论
学习笔记
Joe主题懒人版
Joe主题懒人版是基于Joe主题再续前缘版修改而来(其实就是把百度上所能找到的大部分美化功能添加进去了),代码改的很乱,大佬勿喷(毕竟大部分代码原教程是什么样的,文件里面就是什么样的格式就肯定不规范) 演示站 囧的小站 新增功能介绍 兼容RuleUser,只需主题外观设置开启并填入RuleUser目录名即可接管主题的登录注册以及评论功能,只要激活TePass插件即可接管登录注册功能以及在文章中插入付费的功能 优先级 RuleUser>TePass>主题自带前台登陆注册 多种方式在评论区显示ip(腾讯LBS+纯真数据库) 添加评论楼层,评论者等级(侧边互动读者),评论框添加随机一言,图片评论 侧边添加图片诗句,普通样式标签云 文章多种点赞、以及添加多种打赏样式、Markdown扩展语法、MathJax支持、文章字数统计和文章阅读时间统计、文章右上角添加版权角标 添加阅读模式,伸缩侧边栏开关底部好久不见样式,底部在线人数、博主在线时间和cnzz统计 修改代码高亮样式为CodePrettify插件同款样式(其实就是直接扒的ta的css和最新的Prismjs) 添加PHP五秒盾,一键开启全站维护,后台开启禁用F12,右键美化,访客入站提示,左下角fps等信息显示 添加时光机、github、相册单页 修改无头图时自动获取的头图来源 更多功能自行探索········ 2.x版本说明 目前还在不断完善中,修复了1.x版本中的已知bug,新增了部分新功能,本地化全部静态资源 注意: 2.x的密语功能与1.x不兼容 2.x还在开发中,部分1.x的功能尚未加入,正在陆续加入中 下载地址 {anote icon=" {anote icon="fa fa-download" href="//wwxk.lanzouy.com/b018jqbzg" type="secondary" content="点击前去下载1.x版"/} {anote icon=" {anote icon="fa fa-download" href="//letan.lanzouy.com/b018uwfbi" type="secondary" content="点击前去下载2.x版"/} 密码 1.x:eujs 2.x:5m8x 感谢 Brains - 灵感乌托邦 (fuuuy.cn) 尘遇 (chenyu.me) 沉默的博客 (cmsblog.cn) 即刻学术 - 科技资讯、学术资源、会议交流、视频活动以及兴趣部落社交等信噪比最高的网站 (ijkxs.com) zzd/photo-page-for-typecho: typecho相册单页模板,单页模板非主题,可嵌入任何主题。Typecho photo album page template. (github.com) 故梦吖 - 知足得以常乐 (gmit.vip) 易航 泽泽社 - 简单记录生活亦或是黑历史 (zezeshe.com) 陶小桃Blog - 无限进步的优质帅气大学生! (52txr.cn) 因为魔改教程来源百度,所以很多作者没有找到如果主题用到了你改教程可以在下方留言添加上 [timeline title="更新记录" type="small"] [item date="2023-2-11"] 1.0版本发布 [/item] [item date="2023-2-12"] 新增转载角标图片、评论框右下角自定义图片、打字特效,统一评论框字体[/item] [/timeline]
2023年02月11日
丨
1.7k阅读
丨
149评论
网站建设
C语言中的链表:定义、操作与实现
什么是链表 链表是一种常用的数据结构,它由若干个结点组成。每个结点都有两部分组成:数据域和指针域。数据域存储结点的值,而指针域则指向下一个结点。由于链表的每个结点都有指针域,所以链表可以动态分配内存。 链表的类型 链表主要分为单链表和双链表两种。单链表只有一个指针域,指向下一个结点,而双链表则有两个指针域,分别指向前驱结点和后继结点。 C语言中的链表 在C语言中,链表可以通过结构体和指针来实现。结构体可以存储结点的数据域和指针域,而指针则可以实现结点之间的连接。 struct Node { int data; struct Node* next; }; 链表的操作 插入结点:在链表的头部或尾部插入新结点。 删除结点:删除链表中指定的结点。 遍历链表:遍历链表中的每一个结点。 查找结点:查找链表中指定的结点。 链表的实现 下面是一个简单的链表实现的例子,包括创建链表、插入结点、删除结点、遍历链表等操作。 #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; }; // 创建链表 struct Node* createList() { struct Node* head = NULL; return head; } // 插入结点 void insertNode(struct Node** head, int data) { struct Node* newNode = (struct Node*) malloc(sizeof(struct Node)); newNode->data = data; newNode->next = *head; *head = newNode; } // 删除结点 void deleteNode(struct Node** head, int data) { struct Node* temp = *head, *prev; if (temp != NULL && temp->data == data) { *head = temp->next; free(temp); return; } while (temp != NULL && temp->data != data) { prev = temp; temp = temp->next; } if (temp == NULL) return; prev->next = temp->next; free(temp); } // 遍历链表 void traverseList(struct Node* head) { struct Node* temp = head; while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } } int main() { struct Node* head = createList(); insertNode(&head, 1); insertNode(&head, 2); insertNode(&head, 3); traverseList(head); deleteNode(&head, 2); printf("\n"); traverseList(head); return 0; } 以上就是C语言中链表的定义、操作和实现的简要介绍。链表是一种非常重要的数据结构,广泛应用于许多算法和程序中。了解链表可以帮助我们更好地理解和使用这种数据结构。链表中指定的结点。 链表的实现 下面是一个简单的链表实现的例子,包括创建链表、插入结点、删除结点、遍历链表等操作。 #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; }; // 创建链表 struct Node* createList() { struct Node* head = NULL; return head; } // 插入结点 void insertNode(struct Node** head, int data) { struct Node* newNode = (struct Node*) malloc(sizeof(struct Node)); newNode->data = data; newNode->next = *head; *head = newNode; } // 删除结点 void deleteNode(struct Node** head, int data) { struct Node* temp = *head, *prev; if (temp != NULL && temp->data == data) { *head = temp->next; free(temp); return; } while (temp != NULL && temp->data != data) { prev = temp; temp = temp->next; } if (temp == NULL) return; prev->next = temp->next; free(temp); } // 遍历链表 void traverseList(struct Node* head) { struct Node* temp = head; while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } } int main() { struct Node* head = createList(); insertNode(&head, 1); insertNode(&head, 2); insertNode(&head, 3); traverseList(head); deleteNode(&head, 2); printf("\n"); traverseList(head); return 0; } 在这个示例中,我们首先定义了一个结构体类型Node,其中包含了数据域和指针域。然后我们定义了一系列函数,用来实现链表的创建、插入、删除和遍历等操作。 总结 总结。链表是一种重要的数据结构,它通过链接结点来组织数据,支持动态地增加、删除数据。在C语言中,我们可以通过结构体和指针来实现链表,并定义相关函数来支持链表的各种操作。在实际应用中,链表可以用来实现队列、栈等数据结构,也可以用来实现其他的应用,如链表排序等。 总之,链表是一种重要的数据结构,在C语言编程中有着广泛的应用。通过学习和练习,可以深入理解链表的实现原理和应用场景,提高编程能力。
2023年01月28日
丨
85阅读
丨
1评论
学习笔记
C语言中结构体的运用
在C语言中,"."号和"->"号是用来访问结构体中成员的运算符。 "."号 "."号用来访问结构体中的成员变量。当结构体变量在内存中连续存储时,使用"."号访问结构体中的成员变量。 struct Student { int age; char name[20]; float score; }; int main() { struct Student stu; stu.age = 20; strcpy(stu.name, "Mike"); stu.score = 89.5; return 0; } "->"号 "->"号用来访问结构体中的成员变量,当结构体变量存储在指针变量中时,使用"->"号访问结构体中的成员变量。 struct Student { int age; char name[20]; float score; }; int main() { struct Student stu; struct Student *pstu = &stu; pstu->age = 20; strcpy(pstu->name, "Mike"); pstu->score = 89.5; return 0; } 比较 在上面的两个例子中,我们可以看出 "." 号和 "->" 号的主要区别就在于它们访问结构体成员变量的方式不同。 "." 号在结构体变量在内存中连续存储时使用,而 "->" 号在结构体变量存储在指针变量中时使用。 结构体数组 在 C 语言中,结构体数组是可以被定义的,它是由多个结构体变量组成的数组。 在访问结构体数组中的成员变量时,我们可以使用 "." 号或 "->" 号。 例如,定义了一个名为 "students" 的结构体数组,其中包含了 5 个 "Student" 结构体变量,那么可以使用如下方式访问数组中第 3 个元素的 age 成员变量: struct Student { int age; char name[20]; float score; }; int main() { struct Student students[5]; students[2].age = 20; strcpy(students[2].name, "Mike"); students[2].score = 89.5; return 0; } 或者使用指针变量访问 struct Student { int age; char name[20]; float score; }; int main() { struct Student students[5]; struct Student *pstu = &students[2]; pstu->age = 20; strcpy(pstu->name, "Mike"); pstu->score = 89.5; return 0; } 通过这些例子我们可以看出,在访问结构体数组中的成员变量时,我们可以使用 "." 号或 "->" 号,两者在语法上等价。但是在代码中应该根据实际情况来选择使用哪种运算符,以保证代码的正确性和可读性。 结构体的嵌套定义 在 C 语言中,结构体可以嵌套定义,即一个结构体可以包含另一个结构体的成员变量。 例如,定义了一个名为 "Person" 的结构体,其中包含了 "Address" 结构体的成员变量,那么可以使用如下方式访问 Person 结构体中 Address 结构体的 city 成员变量: struct Point { int x; int y; }; struct Rectangle { struct Point topLeft; struct Point bottomRight; }; int main() { struct Rectangle rect; rect.topLeft.x = 0; rect.topLeft.y = 0; rect.bottomRight.x = 10; rect.bottomRight.y = 10; // 使用连续的 "." 号访问成员变量 printf("Top left point: (%d, %d)\n", rect.topLeft.x, rect.topLeft.y); printf("Bottom right point: (%d, %d)\n", rect.bottomRight.x, rect.bottomRight.y); // 使用指针变量访问成员变量 struct Rectangle *prect = ▭ printf("Top left point: (%d, %d)\n", prect->topLeft.x, prect->topLeft.y); printf("Bottom right point: (%d, %d)\n", prect->bottomRight.x, prect->bottomRight.y); return 0; } 上面的例子中,我们定义了两个结构体 Point 和 Rectangle。Point 结构体中包含了 x 和 y 成员变量,而 Rectangle 结构体中包含了两个 Point 结构体的成员变量 topLeft 和 bottomRight。 我们可以使用连续的 "." 号来访问嵌套结构体中的成员变量,比如 rect.topLeft.x 和 rect.bottomRight.y。 也可以使用指针变量访问嵌套结构体中的成员变量,比如 prect->topLeft.x 和 prect->bottomRight.y。 从上面的例子可以看出,嵌套结构体在 C 语言中的应用非常灵活,可以使用 "." 和 "->" 号来访问嵌套结构体中的成员变量。 总结: C语言中结构体是一种重要的数据类型,可以用来组织复杂的数据结构。通过结构体,我们可以将相关的数据项组织在一起,方便程序访问和维护。 在访问结构体成员时,可以使用 "." 号或者是 "->"号,其中 "."号只能用于非指针变量,而 "->"号只能用于指针变量。这两个符号都可以连续使用,来访问嵌套结构体中的成员变量。 希望这篇文章能帮助大家对结构体在C语言中的运用有更深入的了解。
2023年01月27日
丨
63阅读
丨
0评论
学习笔记
正则表达式技巧: 开发中的应用与实践
正则表达式是计算机科学中一种文本处理工具,具有极其广泛的应用。它可以用来验证输入、提取信息、替换文本等。虽然正则表达式看起来有点复杂,但经过练习和熟悉后就会发现它是非常有用的工具。 符号 正则表达式是由一些特殊符号和普通字符组成的模式,这些符号可以用来描述文本的格式和结构。常用的正则表达式符号如下: ^:匹配字符串的开头。 $:匹配字符串的结尾。 .:匹配除换行符以外的任意字符。 *:匹配前面的字符 0 次或多次。 +:匹配前面的字符 1 次或多次。 ?:匹配前面的字符 0 次或 1 次。 {n}:匹配前面的字符 n 次。 {n,}:匹配前面的字符 n 次或更多次。 {n,m}:匹配前面的字符 n 到 m 次。 []:匹配中括号中的任意字符。 [^]:匹配不在中括号中的任意字符。 |:匹配左边或右边的表达式。 ():将表达式分组。 \:转义字符,用来匹配特殊字符。 正则表达式还有一些特殊字符类,例如: \d:匹配数字。 \w:匹配字母和数字。 \s:匹配空白字符,例如空格或制表符。 \D:匹配非数字。 \W:匹配非字母和数字。 \S:匹配非空白字符。 例子 例如,如果你想限制用户输入的是数字,可以这样写正则表达式: var regex = /^\d+$/; 这个正则表达式表示输入的字符串必须以数字开头(^),以数字结尾($),中间可能有多个数字(+)。 如果你想限制用户输入的是电子邮件地址,可以这样写正则表达式: var regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; 例如,使用正则表达式验证电话号码: function validatePhone(phone) { var regex =/^1[3|4|5|7|8][0-9]{9}$/; return regex.test(phone); } console.log(validatePhone("1300000000")); // true console.log(validatePhone("13000000a0")); // false 使用正则表达式替换文本: vartext="Hello, World!"; varregex= /World/; console.log(text.replace(regex, "RegEx")); // "Hello, RegEx!" 使用正则表达式提取信息: var text = "The price is $19.99"; var regex = /\$([0-9]+.[0-9]{2})/; console.log(text.match(regex)[1]); // "19.99" 总结 正则表达式是一种强大的工具,在前端开发中有着广泛的应用,但是需要不断练习和掌握,在编写正则表达式时,需要根据实际需求进行合理的组合和搭配。 正则表达式在开发中的应用非常广泛,例如在表单验证、字符串替换、提取信息等场景中都可以使用到正则表达式。正则表达式还可以在 JavaScript 中通过正则对象和正则表达式方法进行操作。
2023年01月26日
丨
60阅读
丨
0评论
学习笔记
scanf函数的实战应用: 实例演示scanf函数在实际应用中的使用方法
在C语言中,scanf函数是一种常用的读取数据的方式,它可以按照我们预期的格式读取数据。为了让scanf函数更高效地工作,我们可以使用格式化字符串来限制输入的数据类型和长度。 基本格式 scanf函数中的格式化字符串由百分号(%)开头,后面跟着读取数据的格式。例如,"%d"表示读取一个整数,"%f"表示读取一个浮点数,"%s"表示读取一个字符串。 读取整数 如果我们想读取一个整数,可以使用"%d"这种格式化字符串。例如: int a; scanf("%d", &a); 读取浮点数 如果我们想读取一个浮点数,可以使用"%f"这种格式化字符串。例如: float b; scanf("%f", &b); 读取字符串 如果我们想读取一个字符串,可以使用"%s"这种格式化字符串。例如: char str[100]; scanf("%s", str); 限制输入 除了上面提到的基本格式外,scanf函数还支持一些限制输入的格式。 清空输入缓存 在读取多个值时,scanf函数会将之前未读取的数据留在输入缓存中,可能会影响后续的读取。我们可以使用 "%[^\n]% c" 这种格式化字符串来清空输入缓存。其中,"% [^\n]"表示读取到换行符之前的所有字符,"%c"表示读取换行符,但不存储到变量中。例如: scanf("%*[^\n]%*c", NULL); 指定最大读取长度 我们可以使用"%n"这种格式化字符串来指定最大读取长度。例如: char str[100]; scanf("%99s", str); 限制读取范围 我们可以使用"[]"这种格式化字符串来限制读取范围。例如: char c; scanf("%[abcdef]", &c); 这会读取一个字符并存储到变量c中,但只有读取到的字符是"a","b","c","d","e"或"f"时才会成功。 另外,也可以使用"^"反义字符来限制读取范围。例如: char c; scanf("%[^abc]", &c); 指定读取类型 使用"%d","%f","%c"等格式化字符串来指定读取类型,例如: int num; float f; char c; scanf("%d %f %c", &num, &f, &c); 指定宽度 使用"%n"这种格式化字符串来指定最大读取长度。例如: char str[100]; scanf("%99s", str); 跳过空格 使用"%*s"这种格式化字符串来跳过空格,例如: scanf("%*s %d", &num); 数组读取 使用"%n"这种格式化字符串来读取数组,例如: int arr[5]; scanf("%d %d %d %d %d", &arr[0], &arr[1], &arr[2], &arr[3], &arr[4]); 返回值 scanf函数的返回值表示成功读取的项目数。如果scanf读取成功,返回值将大于0,如果scanf读取失败或者已到达文件末尾,返回值为EOF。 例如,在下面的代码片段中,scanf将读取两个整数: int num1, num2; int n = scanf("%d %d", &num1, &num2); 如果两个整数都被成功读取,那么scanf函数的返回值将为2。 因此,我们可以通过检查scanf函数的返回值来确定是否读取成功。如果返回值为0或负数,则说明读取失败。 总之,scanf函数的返回值是一个很有用的指标,可以用来判断读取是否成功,在编写代码时需要注意使用。 总结 总之,scanf函数是C语言中非常常用的函数,其强大的格式化字符串可以帮助我们限制输入的格式,但是,我们在使用scanf函数时也要注意一些细节,如缓存区问题,还要注意scanf函数的返回值,以确定读取是否成功。总结来说,scanf函数是C语言中非常常用的函数,它的格式化字符串能够帮助我们限制输入的格式,但是我们在使用时也要注意一些细节。
2023年01月26日
丨
64阅读
丨
0评论
学习笔记
保护数据隐私的核心技术:加密算法简述
加密解密算法是用来保护数据安全的重要工具。它们可以将明文转换为密文,并在需要时将密文转换回明文。这篇文章将详细介绍三种常用的加密解密算法:AES、RSA和MD5。 AES 首先是AES(高级加密标准)。AES是一种对称加密算法,它使用相同的密钥来加密和解密数据。AES算法采用分组密码体制,分组长度为128位,密钥长度可以是128位、192位或256位。AES采用了10轮或14轮或12轮或20轮的加密循环,并且提供了高安全性和高效率。AES算法由美国联邦政府的国家密码局(NIST)于2001年发布为标准。 RSA 接下来是RSA(Rivest-Shamir-Adleman)。RSA是一种非对称加密算法,它使用一对公钥和私钥来加密和解密数据。公钥可以公开分发,用于加密数据,而私钥必须保密,用于解密数据。RSA算法的安全性基于大整数的分解困难。 RSA算法由罗纳德·李维斯特,阿迪·萨默尔和伦纳德·阿德曼三位科学家在1977年发明。 MD5 最后是MD5(Message-Digest Algorithm 5)。MD5是一种哈希算法,它将任意长度的输入数据映射为固定长度的输出数据(通常是128位的16进制数字)。这个输出结果称为消息摘要或数字指纹。 MD5算法通过一系列的压缩和换位来实现,它具有抗碰撞性,即两个不同的输入数据很小的可能性会产生相同的输出结果。 MD5算法由罗纳德·曼彻斯特在1992年发明。 其他算法 除了AES、RSA和MD5算法之外,还有其他一些常用的加密解密算法。 一种常用的对称加密算法是DES(Data Encryption Standard),它是在1970年代由美国国家安全局(NSA)发明的,是当时主要的加密标准,直到2001年AES取代它为止。DES采用64位分组长度和56位密钥长度,它的安全性已经被提高了版本的AES算法所取代。 另一种常用的非对称加密算法是Elliptic Curve Cryptography(ECC),它是基于椭圆曲线数学原理的密码算法。 ECC比RSA更加高效,并且可以使用更短的密钥长度来达到同样的安全性。 ECC算法相对较新,并且在移动通信和互联网安全领域有着广泛的应用。 还有一种常用的哈希算法是SHA(Secure Hash Algorithm),它是由美国国家安全局(NSA)在1993年发明的。SHA算法与MD5类似,但是更加安全,并且有多个版本,如SHA-1,SHA-2,SHA-3等。 总之,AES、RSA、MD5、DES、ECC和SHA等算法都是常用的加密解密算法,它们各有优缺点,在不同的应用场景中会有所适用。
2023年01月25日
丨
53阅读
丨
0评论
编程开发
网络安全概述: 从HTTP到HTTPS的变进
HTTP和HTTPS之间的关系 HTTP (Hypertext Transfer Protocol) 和 HTTPS (Hypertext Transfer Protocol Secure) 是两种不同的网络协议,它们主要用于在网络上传输数据。 HTTP是一种无状态的协议,它不提供任何加密机制,数据在传输过程中可能会被第三方截取和篡改。这对于一些不敏感的数据是可以接受的,但是对于一些敏感数据,例如网上支付、网上登录等,这是不安全的。 HTTPS是在HTTP上增加了SSL/TLS加密机制的协议,它能够保证数据在传输过程中的安全性。 在使用HTTPS时,需要先进行一次证书验证过程,确保连接的网站是可信的。 HTTPS与SSL证书之间的关系 HTTPS是在HTTP上增加了SSL/TLS加密机制的协议,而SSL/TLS是通过证书来实现的。 证书是由证书颁发机构 (CA) 颁发的,它能够证明网站的真实性。 当用户访问一个HTTPS网站时,浏览器会向网站请求证书,网站会返回证书,浏览器再对证书进行验证,确保网站是可信的。 如果证书验证不通过,浏览器会提示用户连接不安全,用户可以选择放弃访问。 证书验证过程 验证证书有效性:首先,浏览器会检查证书是否被受信任的证书颁发机构 (CA) 签发,并且是否在有效期内。 验证证书主题:接着,浏览器会检查证书中的主题信息,确保证书对应的网站是用户要访问的网站。 验证证书签名:最后,浏览器会检查证书的签名是否有效,确保证书没有被篡改。 如果证书验证成功,浏览器会建立安全连接,否则会提示用户连接不安全。 SSL和TLS SSL (Secure Sockets Layer) 和 TLS (Transport Layer Security) 是两种安全协议,它们主要用于在网络传输过程中加密数据。 SSL是最早的安全协议,它主要用于加密HTTP协议,但是由于安全漏洞的存在,已经被TLS取代。 TLS是在SSL的基础上进行改进的协议,它提供了更高的安全性和性能。 HTTPS协议就是在HTTP协议上使用SSL/TLS加密机制的协议。 总之,HTTP和HTTPS之间的主要区别在于安全性,HTTPS通过证书验证和数据加密,能够保证数据在传输过程中的安全性,而HTTP则没有这样的保障。 网站如何开启强制HTTPS 网站可以通过安装SSL/TLS证书来开启HTTPS。SSL/TLS证书可以由证书颁发机构 (CA) 颁发,颁发过程需要网站提供一些信息,以及网站的域名和IP地址的证明。 网站开启强制HTTPS的原理是通过服务器配置,将所有的HTTP请求重定向到HTTPS。 对于Nginx服务器来说,可以在配置文件中添加如下代码来实现强制HTTPS: server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/ssl.crt; ssl_certificate_key /path/to/ssl.key; # ... other configurations } 上面的代码实现了监听80端口的HTTP请求,并将其重定向到443端口的HTTPS请求。同时,HTTPS请求需要使用ssl_certificate和ssl_certificate_key指定证书文件路径。 需要注意的是,在这种方式下,由于重定向会改变URL,所以搜索引擎可能会认为HTTP和HTTPS是两个不同的页面,因此最好还是使用.htaccess或者301重定向来实现强制HTTPS,避免重复内容导致的搜索引擎爬取问题。 除了上面的方式,还有其他几种实现强制HTTPS的方式。 通过.htaccess文件实现强制HTTPS 在Apache服务器上,可以在.htaccess文件中添加如下代码来实现强制HTTPS: RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 通过301重定向实现强制HTTPS 可以在服务器配置文件中设置301重定向,将HTTP请求重定向到HTTPS。 对于Nginx服务器来说,可以在配置文件中添加如下代码实现强制HTTPS: server { listen 80; server_name example.com; rewrite ^ https://$server_name$request_uri? permanent; } server { listen 443 ssl; server_name example.com; ssl_certificate /path/to/ssl.crt; ssl_certificate_key /path/to/ssl.key; # ... other configurations } 总之,通过上述方式,网站可以强制使用HTTPS协议,保证数据在传输过程中的安全性。 总结 通过上面的文章,我们了解了HTTP和HTTPS之间的关系,以及HTTPS与SSL证书之间的关系。我们知道了HTTPS是在HTTP上增加了SSL/TLS加密机制的协议,它能够保证数据在传输过程中的安全性。并且了解了证书验证过程,以及网站如何开启强制HTTPS,以及 SSL和TLS的定义。 补充内容 301和302重定向对搜索引擎收录的影响 301重定向和302重定向都是用来重定向网页的,但是它们有一些区别。 · 301重定向:表示永久重定向,当用户或搜索引擎访问原网页时,会自动跳转到新网页。301重定向通常用于网站进行永久性移动或重构。 · 302重定向:表示暂时重定向,当用户或搜索引擎访问原网页时,会自动跳转到新网页,但是未来可能会恢复到原网页。302重定向通常用于网站进行临时移动或重构。 为什么301不影响搜索引擎收录?而302要影响搜索引擎收录? 因为301重定向表示永久重定向,搜索引擎会将原网页的权重转移到新网页上,并且不再索引原网页。而302重定向表示暂时重定向,搜索引擎不会将权重转移到新网页上,并且会继续索引原网页。如果网站想要更新网页而不影响搜索引擎收录,应该使用301重定向。
2023年01月24日
丨
69阅读
丨
0评论
编程开发
查看更多