当前位置: 首页 > news >正文

[大师C语言(第二十五篇)]C语言字符串探秘

引言

字符串是编程中不可或缺的基本数据类型之一,它用于表示和操作文本数据。在C语言中,字符串以一种独特的方式实现,与许多其他编程语言的处理方式不同。本文将深入探讨C语言字符串背后的技术,帮助你更好地理解和应用字符串。

第一部分:字符串的基本概念和操作

1.1 字符串的定义

在C语言中,字符串不是作为一个独立的内置数据类型,而是作为字符数组来处理的。一个字符串是由一系列字符组成的序列,以一个特殊的字符’\0’(空字符)作为结束标志。

char str[] = "Hello, World!";

在上面的例子中,str是一个包含14个字符的数组,其中最后一个字符是空字符’\0’,用来表示字符串的结束。

1.2 字符串的初始化

字符串可以像普通数组一样初始化,也可以使用字符串字面量来初始化。

char str[] = "Hello"; // 自动计算长度,包含空字符
char str2[10] = "Hello"; // 明确指定长度,空字符会被自动添加

1.3 字符串的长度

C语言中没有内置的字符串长度函数,因此通常需要自己编写函数来计算字符串的长度。

#include <stdio.h>int getStringLength(const char *str) {int length = 0;while (*str != '\0') {length++;str++;}return length;
}int main() {char str[] = "Hello, World!";printf("The length of the string is: %d\n", getStringLength(str));return 0;
}

1.4 字符串的输出

可以使用printf函数来输出字符串。

#include <stdio.h>int main() {char str[] = "Hello, World!";printf("%s\n", str);return 0;
}

1.5 字符串的输入

可以使用scanfgets函数来从用户输入读取字符串。gets函数存在安全风险,因为它不检查字符串长度,可能导致缓冲区溢出。因此,通常建议使用fgets函数。

#include <stdio.h>int main() {char str[20];printf("Enter a string: ");fgets(str, sizeof(str), stdin);printf("You entered: %s\n", str);return 0;
}

1.6 字符串的连接

在C语言中,字符串的连接需要手动实现,因为没有内置的字符串连接函数。

#include <stdio.h>
#include <string.h>void stringConcat(char *dest, const char *src) {while (*dest != '\0') {dest++;}while (*src != '\0') {*dest = *src;dest++;src++;}*dest = '\0';
}int main() {char str1[20] = "Hello, ";char str2[] = "World!";stringConcat(str1, str2);printf("Concatenated string: %s\n", str1);return 0;
}

总结

在第一部分中,我们介绍了C语言字符串的基本概念和操作,包括字符串的定义、初始化、长度计算、输出、输入以及字符串的连接。这些知识是理解C语言字符串的基础,为后续深入探讨字符串的更高级应用打下了坚实的基础。在下一部分中,我们将继续探讨字符串的更多操作和特性。

第二部分:字符串的更多操作和特性

2.1 字符串比较

在C语言中,字符串比较通常使用strcmp函数,该函数来自string.h头文件。strcmp函数比较两个字符串,返回三个可能的值:0(如果字符串相等)、小于0(如果第一个字符串在字典顺序上小于第二个字符串)或大于0(如果第一个字符串在字典顺序上大于第二个字符串)。

#include <stdio.h>
#include <string.h>int main() {char str1[] = "Apple";char str2[] = "Banana";int result = strcmp(str1, str2);if (result < 0) {printf("str1 is less than str2\n");} else if (result > 0) {printf("str1 is greater than str2\n");} else {printf("str1 is equal to str2\n");}return 0;
}

2.2 字符串复制

字符串复制使用strcpy函数,该函数同样来自string.h头文件。strcpy函数将源字符串复制到目标字符串中,确保目标字符串有足够的空间来存储复制的字符串。

#include <stdio.h>
#include <string.h>int main() {char str1[] = "Hello, World!";char str2[20];strcpy(str2, str1);printf("Copied string: %s\n", str2);return 0;
}

2.3 字符串子串

提取字符串的子串可以使用strncpy函数,该函数允许指定要复制的字符数量。如果要确保子串以空字符结尾,需要手动添加空字符。

#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello, World!";char subStr[10];strncpy(subStr, str, 5); // 复制前5个字符subStr[5] = '\0'; // 确保子串以空字符结尾printf("Substring: %s\n", subStr);return 0;
}

2.4 字符串查找

在字符串中查找子串或字符可以使用strstr函数(查找子串)或strchr函数(查找字符)。strstr函数返回子串在字符串中首次出现的位置的指针,如果没有找到则返回NULL。strchr函数返回字符在字符串中首次出现的位置的指针,如果没有找到则返回NULL。

#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello, World!";char *pos = strstr(str, "World");if (pos != NULL) {printf("Substring found: %s\n", pos);} else {printf("Substring not found.\n");}return 0;
}

2.5 字符串转换

字符串与数值之间的转换在C语言中需要手动实现。可以使用atoi(整数转换)和atof(浮点数转换)等函数,这些函数同样来自stdlib.h头文件。

#include <stdio.h>
#include <stdlib.h>int main() {char str[] = "123";int num = atoi(str);printf("String to integer: %d\n", num);return 0;
}

总结

在第二部分中,我们介绍了C语言字符串的一些高级操作和特性,包括字符串比较、复制、子串提取、查找以及字符串与数值的转换。这些操作和特性是处理C语言字符串时常用的高级工具,它们增加了编程的灵活性和功能。在下一部分中,我们将继续深入探讨字符串的其他高级应用和技巧。

第三部分:字符串的高级应用和技巧

3.1 字符串的分割

在C语言中,字符串的分割通常需要手动实现。一种常见的方法是使用strtok函数,它可以从字符串中提取子串,并将剩余的字符串作为下一次调用的参数。

#include <stdio.h>
#include <string.h>int main() {char str[] = "One, Two, Three";char *token;token = strtok(str, ",");while (token != NULL) {printf("Token: %s\n", token);token = strtok(NULL, ",");}return 0;
}

3.2 字符串与函数参数

在C语言中,字符串可以通过指针作为函数参数传递。这使得函数可以修改字符串的内容。

#include <stdio.h>void modifyString(char *str) {str[0] = 'H'; // 修改第一个字符str[1] = 'e'; // 修改第二个字符
}int main() {char str[] = "Hello";modifyString(str);printf("Modified string: %s\n", str);return 0;
}

3.3 字符串与结构体

在C语言中,字符串可以与结构体结合使用,以存储复杂的数据。

#include <stdio.h>typedef struct Person {char name[50];int age;
} Person;int main() {Person person = {"John", 30};printf("Name: %s, Age: %d\n", person.name, person.age);return 0;
}

3.4 字符串与文件操作

在C语言中,字符串可以用于文件操作,如读取文件内容、写入文件等。

#include <stdio.h>
#include <stdlib.h>int main() {FILE *file = fopen("example.txt", "r");if (file != NULL) {char buffer[200];while (fgets(buffer, sizeof(buffer), file) != NULL) {printf("%s", buffer);}fclose(file);}return 0;
}

3.5 字符串与标准库

C语言提供了丰富的字符串处理函数,这些函数通常位于string.hstdlib.h头文件中。使用这些函数可以简化字符串处理,提高编程效率。

#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello, World!";strncat(str, "!", 1); // 添加字符到字符串printf("Modified string: %s\n", str);return 0;
}

总结

在第三部分中,我们探讨了C语言字符串的一些高级应用和技巧,包括字符串的分割、与函数参数的结合、与结构体的结合、与文件操作的结合以及与标准库的结合。这些高级应用和技巧展示了C语言字符串的强大功能和灵活性,它们使得字符串处理更加高效和方便。在下一部分中,我们将探讨字符串在实际编程中的常见问题和最佳实践。

第四部分:字符串的常见问题和最佳实践

4.1 字符串的安全性问题

在C语言中,字符串操作可能会引发安全问题,如缓冲区溢出。为了避免这些问题,应该遵循一些最佳实践,如使用strncpy而不是strcpy,使用fgets而不是gets,以及确保字符串缓冲区有足够的空间。

#include <stdio.h>
#include <string.h>int main() {char str[20];printf("Enter a string: ");fgets(str, sizeof(str), stdin);printf("You entered: %s\n", str);return 0;
}

4.2 字符串的内存管理

在C语言中,字符串通常作为字符数组处理,这意味着它们需要手动管理内存。为了避免内存泄漏,应该在不再需要字符串时释放其内存。

#include <stdio.h>
#include <stdlib.h>int main() {char *str = (char *)malloc(20 * sizeof(char));if (str != NULL) {strcpy(str, "Hello");printf("Memory allocated: %s\n", str);free(str); // 释放内存str = NULL; // 避免野指针}return 0;
}

4.3 字符串与指针

在C语言中,字符串与指针紧密相关。字符串通常作为字符数组处理,而指针可以用来操作字符串。

#include <stdio.h>int main() {char str[] = "Hello, World!";char *p = str;printf("String: %s\n", str);printf("Pointer: %s\n", p);return 0;
}

4.4 字符串与字符串函数

C语言提供了丰富的字符串处理函数,这些函数通常位于string.hstdlib.h头文件中。使用这些函数可以简化字符串处理,提高编程效率。

#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello, World!";strcpy(str, "Hello, World!"); // 复制字符串strcat(str, "!"); // 连接字符串printf("Modified string: %s\n", str);return 0;
}

4.5 字符串与多字节字符

C语言的字符串通常假设每个字符占用一个字节。如果字符串包含多字节字符,如中文字符,则需要特别处理。

#include <stdio.h>int main() {char str[] = "你好"; // 包含中文字符的字符串printf("String: %s\n", str);return 0;
}

总结

在第四部分中,我们探讨了C语言字符串的一些常见问题和最佳实践,包括字符串的安全性问题、内存管理、与指针的关系、与字符串函数的结合以及处理多字节字符。这些知识点有助于避免编程中的常见错误,提高程序的健壮性和效率。在最后一部分中,我们将通过一些实际的编程示例来巩固和运用这些知识。

第五部分:字符串的实际编程示例

5.1 示例:字符串拼接

在这个示例中,我们将使用字符串拼接来创建一个问候语。

#include <stdio.h>
#include <string.h>int main() {char name[50];printf("Enter your name: ");fgets(name, sizeof(name), stdin);name[strcspn(name, "\n")] = 0; // 移除输入中的换行符char greeting[] = "Hello, ";strcat(greeting, name);strcat(greeting, "!");printf("Greeting: %s\n", greeting);return 0;
}

5.2 示例:字符串排序

在这个示例中,我们将使用字符串比较函数来对字符串进行排序。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int compareStrings(const void *a, const void *b) {return strcmp(*(const char **)a, *(const char **)b);
}int main() {char names[] = {"John", "Alice", "Bob", "Eve"};qsort(names, 4, sizeof(char *), compareStrings);printf("Sorted names: ");for (int i = 0; names[i] != NULL; i++) {printf("%s ", names[i]);}printf("\n");return 0;
}

5.3 示例:字符串查找

在这个示例中,我们将使用字符串查找函数来查找一个单词在一个文本文件中的所有出现。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {FILE *file = fopen("example.txt", "r");if (file != NULL) {char word[50];printf("Enter a word to search for: ");fgets(word, sizeof(word), stdin);word[strcspn(word, "\n")] = 0; // 移除输入中的换行符while (fgets(word, sizeof(word), file) != NULL) {char *pos = strstr(word, "search");if (pos != NULL) {printf("Found: %s\n", pos);}}fclose(file);}return 0;
}

5.4 示例:字符串替换

在这个示例中,我们将使用字符串复制和查找函数来替换一个单词在一个文本文件中的所有出现。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {FILE *file = fopen("example.txt", "r+");if (file != NULL) {char word[50];printf("Enter a word to replace: ");fgets(word, sizeof(word), stdin);word[strcspn(word, "\n")] = 0; // 移除输入中的换行符while (fgets(word, sizeof(word), file) != NULL) {char *pos = strstr(word, "replace");if (pos != NULL) {pos[0] = 'r';pos[1] = 'e';pos[2] = 'p';pos[3] = 'l';pos[4] = 'a';pos[5] = 'c';pos[6] = 'e';pos[7] = 'd';}}fclose(file);}return 0;
}

5.5 示例:字符串与文件操作

在这个示例中,我们将使用字符串和文件操作函数来创建一个文本文件并写入字符串。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main() {FILE *file = fopen("output.txt", "w");if (file != NULL) {char content[] = "This is the content of the file.";fputs(content, file); // 将字符串写入文件fclose(file);} else {perror("Error opening file");}return 0;
}

总结

在第五部分中,我们通过一系列实际的编程示例来展示了C语言字符串的实际应用。这些示例包括字符串拼接、排序、查找、替换以及字符串与文件操作的结合。这些示例不仅加深了我们对字符串的理解,还提供了在实际编程中应用字符串的最佳实践。通过这些示例,我们可以更好地理解字符串在C语言编程中的重要性,并能够在实际应用中更加有效地使用它。

相关文章:

[大师C语言(第二十五篇)]C语言字符串探秘

引言 字符串是编程中不可或缺的基本数据类型之一&#xff0c;它用于表示和操作文本数据。在C语言中&#xff0c;字符串以一种独特的方式实现&#xff0c;与许多其他编程语言的处理方式不同。本文将深入探讨C语言字符串背后的技术&#xff0c;帮助你更好地理解和应用字符串。 …...

xLua(一) 环境安装笔记

为了方便查阅记录一下xLua的安装地址及方法 1.登录地址下载: https://github.com/Tencent/xLua 2.解压文件 将文件中的这些内容拷贝到项目中的Asset文件夹中 注意 : 工程项目路径不得含有中文 3.将Tools复制到Asset同级目录下 4.导入后会发现有Bug,需要导入工程 5.还有另…...

Python基础教程(十一):数据结构汇总梳理

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…...

制造型企业图纸泄露问题,如何从根源解决核心文件资料泄露问题?

制造型企业最核心重要的文件当然是图纸&#xff0c;图纸在制造型企业中起到关键主导地位&#xff0c;如果图纸泄露与研发性企业源代码被泄露一样的严重&#xff0c;制造型企业如何保护核心图纸不被外泄是企业在日常经营过程中的重要组成部分&#xff0c;现在有很多防止泄露的产…...

英伟达最新GPU和互联路线图分析

Nvidia在计算、网络和图形领域独树一帜&#xff0c;其显著优势在于雄厚的资金实力及在生成式人工智能市场的领先地位。凭借卓越的架构、工程和供应链&#xff0c;Nvidia能够自由实施创新路线图&#xff0c;引领行业未来。 到 21 世纪&#xff0c;Nvidia 已经是一个非常成功的创…...

Github 2024-06-10 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-10统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目2Go项目2PHP项目1Blade项目1TypeScript项目1Lua项目1Dart项目1Swift项目1Cuda项目1Python项目1MDX项目1Ventoy: 100%开源的可启动USB解决方…...

前后端分离项目中Spring Boot返回的时间与前端相差8个小时

概述 今天在做一个前后端分离项目时,发现从后端获取的时间与从数据库获取的时间相差八个小时&#xff0c;最终排查后发现由于Springboot使用本地时区导致&#xff0c;修改SpringBoot时区后解决 环境 MySQL8SpringBoot 原因排查 发现从后端获取的数据总是比前端快八个小时 …...

stm32MP135裸机编程:使用USB/UART烧录程序到SD卡并从SD卡启动点亮一颗LED灯

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf STM32CubeProgrammer v2.16.0 烧录需要的二进制文件1 烧录到SD卡需要哪些文件 参考《轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序》&#xff0c;烧录需要的SD卡文件如下&#xff1a; &a…...

【NoSQL数据库】Redis Cluster集群(含redis集群扩容脚本)

Redis Cluster集群 Redis ClusterRedis 分布式扩展之 Redis Cluster 方案功能数据如何进行存储 redis 集群架构集群伸缩向集群中添加一个新的master节点&#xff0c;并向其中存储 num10 .脚本对redis集群扩容缩容&#xff0c;脚本参数为redis集群&#xff0c;固定从6001移动200…...

重邮计算机网络803-(2)物理层

一.物理层 1.介绍 物理层的主要任务描述为确定与传输媒体的接口的一些特性&#xff0c;即&#xff1a; ①机械特性 指明接口所用接线器的形状和尺寸、引线数目和排列、固定和锁定装置等等。 ②电气特性 指明在接口电缆的各条线上出现的电压的范围。 ③功能特性 指明某条线上…...

uniapp使用webview内嵌H5的注意事项

一、描述 uniapp项目中构建app&#xff0c;需要内嵌H5页面&#xff0c;在使用webview时&#xff0c;遇到了以下几个问题&#xff1a; 内嵌H5&#xff0c;默认全屏显示&#xff1b;内嵌页面遮挡住了app的自定义tabbar组件&#xff1b;样式修改无效&#xff1b; 二、解决方案&a…...

现代 C++的高效并发编程模式

现代C提供了许多高效的并发编程模式&#xff0c;以满足日益增长的多核和分布式系统的需求。以下是一些常用的高效并发编程模式&#xff1a; 异步编程&#xff1a;使用std::async来创建异步任务&#xff0c;可以在后台执行任务&#xff0c;将结果返回给调用者。 并行编程&#…...

汇编语言作业(五)

目录 一、实验目的 二、实验内容 三、实验步骤以及结果 四、实验结果与分析 五、 实验总结 一、实验目的 1.熟悉掌握汇编语言的程序结构&#xff0c;能正确书写数据段、代码段等 2&#xff0c;利用debug功能&#xff0c;查看寄存器&#xff08;CS,IP,AX,DS..)及数据段的…...

收音机的原理笔记

1. 收音机原理 有线广播&#xff1a;我们听到的声音是通过空气振动进行传播&#xff0c;因此可以通过麦克风&#xff08;话筒&#xff09;将这种机械振动转换为电信号&#xff0c;传到远处&#xff0c;再重新通过扬声器&#xff08;喇叭&#xff09;转换为机械振动&#xff0c…...

排序算法案例

排序算法概述 排序算法是计算机科学中的一个重要主题&#xff0c;用于将一组数据按特定顺序排列。排序算法有很多种&#xff0c;每种算法在不同情况下有不同的性能表现。不同的排序算法适用于不同的场景和数据特征。在选择排序算法时&#xff0c;需要考虑数据规模、数据分布以…...

时间序列评价指标

评价指标 均方误差&#xff08; M S E MSE MSE&#xff09; 定义&#xff1a;预测值与实际值之间差异的平方和的平均值。公式&#xff1a; ( M S E 1 n ∑ i 1 n ( y i − y ^ i ) 2 ) (MSE \frac{1}{n}\sum_{i1}^{n}(y_i - \hat{y}_i)^2) (MSEn1​∑i1n​(yi​−y^​i​)…...

Docker:安装 Orion-Visor 服务器运维的技术指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 Orion-Visor 是一种用于管理和监控容器的工具。它提供了一个直观的界面&#xff0c;用于查看容器的状态、资源使用情况以及日志等信息。在这篇技术博客中&#xff0c;我们将介绍如何…...

HarmonyOS Next 系列之底部标签栏TabBar实现(三)

系列文章目录 HarmonyOS Next 系列之省市区弹窗选择器实现&#xff08;一&#xff09; HarmonyOS Next 系列之验证码输入组件实现&#xff08;二&#xff09; HarmonyOS Next 系列之底部标签栏TabBar实现&#xff08;三&#xff09; 文章目录 系列文章目录前言一、实现原理二、…...

mac怎么录制屏幕?这2个方法你值得拥有

在数字化时代&#xff0c;屏幕录制已经成为一种常见且重要的工具&#xff0c;无论是教学演示、游戏直播还是会议记录&#xff0c;屏幕录制都发挥着不可或缺的作用。对于Mac用户而言&#xff0c;如何高效、便捷地进行屏幕录制&#xff0c;是一个值得探讨的话题&#xff0c;可是很…...

爱德华三坐标软件ACdmis.AC-dmis密码注册机

爱德华三坐标软件 AC-DMIS 是一款功能强大的三坐标测量软件&#xff0c;具有以下特点&#xff1a; • 支持多种测量模式&#xff1a;包括接触式测量、非接触式测量、复合式测量等&#xff0c;可以满足不同类型工件的测量需求。 • 高精度测量&#xff1a;采用先进的测量算法和…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...