15 C 语言字符类型详解:转义字符、格式化输出、字符类型本质、ASCII 码编程实战、最值宏汇总
1 字符类型概述
在 C 语言中,字符类型 char 用于表示单个字符,例如一个数字、一个字母或一个符号。
char 类型的字面量是用单引号括起来的单个字符,例如 'A'、'5' 或 '#'。
当需要表示多个字符组成的序列时,就涉及到了字符串。在 C 语言中,字符串是通过 char 数组来实现的,数组属于构造类型,而非基本数据类型。关于数组和字符串的详细内容,我们将在后续章节专门讲解。
// 定义并初始化 char 类型变量
char letter = 'A'; // 字母
char digit = '5'; // 数字
char symbol1 = '#'; // 符号
char symbol2 = '\n'; // 转义字符,换行符// 错误定义:不是单个字符
// char letters = 'AB'; // 错误:字符常量只能包含一个字符
// char digits = '12'; // 错误:字符常量只能包含一个字符
// char symbols = '#$'; // 错误:字符常量只能包含一个字符
// char chinese = '中'; // 错误:一个汉字字符在 UTF-8 编码中占用多个字节// 可以通过后续学习字符串来存储多个字符
// char str1[] = "Hello"; // 正确:字符串常量可以包含多个字符
2 转义字符
在 C 语言中,可以使用以反斜杠 \ 开头的转义字符来表示一些具有特殊含义的字符。这些转义字符为程序提供了处理特殊字符和格式化输出的能力。
2.1 常见转义字符说明
以下是常见的转义字符及其说明:
转义字符 | 字符名称 | 说明 |
---|---|---|
\n | 换行符 | 将光标移动到下一行的开头(换行),两个 \n 表示空一行 |
\t | 水平制表符 | 插入一个水平制表符(通常等效于 4 或 8 个空格,具体取决于实现) |
\\ | 反斜杠字符 | 由于反斜杠在 C 语言中用作转义字符的引导,所以表示它自身时需要使用两个反斜杠 |
\' | 单引号字符 | 因为在 C 语言中字符常量是由单引号括起来的,所以要在字符串中表示单引号,就需要使用转义字符 |
\" | 双引号字符 | 因为 C 语言中的字符串是由双引号括起来的,所以要在字符串中表示双引号,就需要使用转义字符 |
\a | 响铃(BEL)字符 | 产生声音或可视信号(具体效果取决于系统和终端) |
\b | 退格符 | 将光标向左移动一个位置(可能删除左侧字符,具体行为依赖实现) |
\f | 换页符 | 将光标移动到下一页的开头(具体效果取决于系统和终端) |
\r | 回车符 | 将光标移动到当前行的开头(可能覆盖已有内容,不换行) |
\v | 垂直制表符 | 在垂直方向上移动光标(效果因系统而异) |
\ooo | 八进制转义序列 | 用 1 到 3 位八进制数字(0~7)表示字符,示例:\101 → 八进制 101(十进制 65)→ 字符 'A' 注意:位数不足 3 时,编译器按实际八进制值解析(如 \12 等价于 \012,表示换行符 \n) |
\xhh | 十六进制转义序列 | 用 1 到多位十六进制数字(0~9、A~F、a~f)表示字符,示例:\x41 → 十六进制 41(十进制 65)→ 字符 'A' 注意:通常用 2 位表示 ASCII 字符(如 \x41),但长度灵活(如 \x1F600 表示 Unicode 笑脸 😀) |
- 某些转义字符(如 \a、\b、\f、\v)的效果可能因终端或系统而异。
- 八进制和十六进制转义序列直接对应 ASCII 码,可通过查表验证输出。
扩展:转义字符中的 \r(回车)与 \n(换行)
- 起源与功能
- \r(回车):将光标移回行首(打字机时代功能),不换行。
- \n(换行):将光标移到下一行(纸张滚动功能),不移动行首位置。
- 系统差异
- Unix/Linux/macOS:仅用 \n 表示换行。
- Windows:传统用 \r\n 组合,但现代工具兼容 \n(网络协议仍需 \r\n)。
- C 语言中的抽象
- C 语言统一用 \n 表示换行,实际行为由系统底层决定(如 Unix 直接换行,Windows 可能转换为 \r\n)。
2.2 案例演示
以下是一个 C 程序,演示了上表中所列出的转义字符的用法,并附有详细注释:
#include <stdio.h>int main()
{// 1. 换行符 \n:将光标移动到下一行的开头(换行)printf("这是第一行\n这是第二行\n\n"); // 两个 \n 表示空一行// 2. 水平制表符 \t:插入一个水平制表符(通常等效于 4 或 8 个空格,具体取决于实现)printf("姓名:\t张三\n年龄:\t25\n\n");// 3. 反斜杠字符 \\:表示一个反斜杠本身printf("路径示例: C:\\\\Program Files\\\n\n"); // 路径示例: C:\\Program Files\// 4. 单引号字符 \':在字符常量中表示单引号printf("单引号示例: \'A\'\n\n"); // 单引号示例: 'A'// 5. 双引号字符 \":在字符串中表示双引号printf("双引号示例: \"Hello\"\n\n"); // 双引号示例: "Hello"// 6. 响铃字符 \a:产生声音或可视信号(具体效果取决于系统和终端)printf("响铃提示:\a 请注意!\n\n");// 7. 退格符 \b:将光标向左移动一个位置(可能删除左侧字符,具体行为依赖实现)printf("退格示例: 12\b3\n\n"); // 输出可能为 "13",因为 \b 可能会删除左侧的字符 '2'// 8. 换页符 \f:将光标移动到下一页的开头(具体效果取决于系统和终端)printf("第一页\f这是第二页的内容\n\n");// 9. 回车符 \r:将光标移动到当前行的开头(可能覆盖已有内容,不换行)printf("123\r456\n\n"); // 输出 "456",因为 \r 覆盖了前面的 "123"// 10. 垂直制表符 \v:在垂直方向上移动光标(效果因系统而异)printf("垂直制表符:\v新行1\v新行2\n\n");// 11. 八进制转义序列 \ooo:用 1 到 3 位八进制数字(0~7)表示字符printf("八进制示例: \101\n"); // \101 对应 ASCII 码 65,即 'A'printf("八进制示例: \12\n"); // \12 对应 ASCII 码 10,即换行符 \nprintf("八进制示例: \141\n\n"); // \141 对应 ASCII 码 97,即 'a'// 12. 十六进制转义序列 \xhh:用 1 到多位十六进制数字(0~9、A~F、a~f)表示字符printf("十六进制示例: \x41\n"); // \x41 对应 ASCII 码 65,即 'A'printf("十六进制示例: \x0A\n"); // \x0A 对应 ASCII 码 10,即换行符 \nprintf("十六进制示例: \x61\n"); // \x61 对应 ASCII 码 97,即 'a'return 0;
}
程序在 VS Code 中的运行结果如下所示:
2.3 单双引号转义使用要点
在 C 语言中,字符串是由双引号 " " 括起来的字符序列。当我们需要在字符串中合理使用单引号和双引号时,需要遵循特定规则:
- 单引号在字符串中的使用:在由双引号包围的字符串内部,可以直接使用单引号,无需进行转义。因为单引号在这里被当作字符串的普通字符内容,而非界定字符常量的符号。例如:
printf("This is a 'character' inside a string.\n");
// 输出结果:This is a 'character' inside a string.
上述代码执行后,会正常输出字符串,其中单引号会被当作字符串的一部分输出,输出结果为:This is a 'character' inside a string.
- 双引号在字符串中的使用:由于双引号本身用于界定字符串的开始和结束,所以不能直接在双引号界定的字符串内部使用另一个未转义的双引号。若要在字符串中包含双引号字符,必须使用转义字符 \ 对其进行转义。经过转义后,紧随转义字符的双引号就会被视为字符串的一部分,而非字符串的结束标志。如下图所示:
3 字符类型格式占位符
在 C 语言中,使用格式化输出函数(如 printf)时,针对 char 类型的数据,有不同的格式占位符来满足不同的输出需求:
- 使用 %c 格式化占位符,可以直接输出 char 类型的字符本身。例如,printf("%c", 'a'); 会输出字符 a。
- 使用 %d 格式化占位符,可以输出该字符对应的 ASCII 码值。例如,printf("%d", 'a'); 会输出 97,即字符 'a' 在 ASCII 码表中的十进制数值。
#include <stdio.h>int main()
{// 定义一个字符变量char c = 'a';// 使用 %c 输出字符本身printf("使用 %%c 输出字符: %c\n", c); // 输出: a// 使用 %d 输出字符对应的 ASCII 码值printf("使用 %%d 输出 ASCII 码值: %d\n", c); // 输出: 97return 0;
}
程序在 VS Code 中的运行结果如下所示:
4 字符类型的本质
在 C 语言中,char 类型本质上是一个整数类型,它对应着 ASCII 码表中的数字,其存储长度固定为 1 个字节(8 位)。
字符型可进一步细分为 signed char(有符号字符类型)和 unsigned char(无符号字符类型)。
- signed char 的取值范围是 -128 到 127。
- unsigned char 的取值范围是 0 到 255。
在实际使用中,char 类型默认是否带符号取决于当前的运行环境。
可通过 <limits.h> 头文件中的宏定义直接获取取值范围:
- SCHAR_MIN / SCHAR_MAX:signed char 的最小 / 最大值。
- UCHAR_MAX:unsigned char 的最大值(最小值固定为 0)。
字符型数据在存储和读取过程中,会涉及到 ASCII 码的转换。例如,字符 'a' 在 ASCII 码表中对应的十进制数字是 97,在存储时以二进制形式存储,读取时再根据 ASCII 码表还原为字符 'a'。具体过程可参考下图:
#include <stdio.h>
#include <limits.h> // 用于获取字符类型的范围int main()
{// 1. 验证 char 类型的存储长度printf("char 类型的存储长度: %zu 字节\n", sizeof(char)); // 输出: 1 字节// 2. 输出 signed char 和 unsigned char 的范围printf("signed char 范围: %d 到 %d\n", SCHAR_MIN, SCHAR_MAX); // -128 到 127printf("unsigned char 范围: 0 到 %u\n", UCHAR_MAX); // 0 到 255// 3. 演示 char 类型的整数特性(ASCII 码值)char c = 'A'; // 字符 'A' 对应 ASCII 码 65printf("字符 '%c' 的 ASCII 码值: %d\n", c, c); // 输出: 65// 3.1 通过整数操作修改字符,验证 char 类型的整数特性c = c + 1; // ASCII 码值 +1,'A' -> 'B'printf("修改后的字符(+1): '%c'(ASCII 码值: %d)\n", c, c); // 输出: 'B' 和 66c = c - 1; // ASCII 码值 -1,'B' -> 'A'printf("修改后的字符(-1): '%c'(ASCII 码值: %d)\n", c, c); // 输出: 'A' 和 65// 3.2 定义 unsigned char 类型变量,存储整数值,验证 char 类型的整数特性unsigned char d = 67; // 存储 ASCII 码值 67,对应字符 'C'// char 类型整数字面量没有后缀形式,这里的 67 其实是 int 类型,编译器进行了隐式类型转换printf("字符 '%c'(ASCII 码值: %d)\n", d, d); // 输出: 'C' 和 67// 3.3 定义 int 类型数据,存储整数值,验证 char 类型的整数特性int i = 68;printf("字符 '%c'(ASCII 码值: %d)\n", i, i); // 输出: 'D' 和 68return 0;
}
程序在 VS Code 中的运行结果如下所示:
5 整数/浮点/字符类型的最值宏汇总
在 C 语言中,可以通过引入头文件 <limits.h>(整数 / 字符类型)和 <float.h>(浮点数类型),使用宏定义来获取各种类型的取值范围。以下是分类总结:
5.1 整数类型(包括 char)
需引入头文件:#include <limits.h>
最值宏名称及其含义:
类型 | 宏定义 | 含义 | 示例值(32 位系统) |
---|---|---|---|
char | CHAR_MIN / CHAR_MAX | 默认 char 的最小 / 最大值(符号性取决于环境) | 依赖编译器(可能是 -128 到 127 或 0 到 255 ) |
signed char | SCHAR_MIN | signed char 的最小值 | -128 |
SCHAR_MAX | signed char 的最大值 | 127 | |
unsigned char | UCHAR_MAX | unsigned char 的最大值 | 255 |
short | SHRT_MIN | short 的最小值 | -32768 |
SHRT_MAX | short 的最大值 | 32767 | |
unsigned short | USHRT_MAX | unsigned short 的最大值 | 65535 |
int | INT_MIN | int 的最小值 | -2147483648 |
INT_MAX | int 的最大值 | 2147483647 | |
unsigned int | UINT_MAX | unsigned int 的最大值 | 4294967295 |
long | LONG_MIN | long 的最小值 | 依赖系统(如 -2147483648 ) |
LONG_MAX | long 的最大值 | 依赖系统(如 2147483647 ) | |
unsigned long | ULONG_MAX | unsigned long 的最大值 | 依赖系统(如 4294967295 ) |
long long | LLONG_MIN | long long 的最小值 | -9223372036854775808 |
LLONG_MAX | long long 的最大值 | 9223372036854775807 | |
unsigned long long | ULLONG_MAX | unsigned long long 的最大值 | 18446744073709551615 |
5.2 浮点数类型
需引入头文件:#include <float.h>
最值宏名称及其含义:
类型 | 宏定义 | 含义 | 示例值(IEEE 754 标准) |
---|---|---|---|
float | FLT_MIN | 最小正规范化值(非零最小值) | 1.175494e-38 |
FLT_MAX | 最大有限值 | 3.402823e+38 | |
FLT_EPSILON | 机器 epsilon(最小可表示差值) 即 1.0 与比 1.0 大的最小可表示单精度浮点数之间的差值,用于判断单精度浮点数的近似相等性或分析数值稳定性 | 1.192093e-7 | |
double | DBL_MIN | 最小正规范化值(非零最小值) | 2.225074e-308 |
DBL_MAX | 最大有限值 | 1.797693e+308 | |
DBL_EPSILON | 机器 epsilon(最小可表示差值) 即 1.0 与比 1.0 大的最小可表示双精度浮点数之间的差值,用于双精度浮点数的误差分析和比较 | 2.220446e-16 | |
long double | LDBL_MIN | 最小正规范化值(非零最小值) | 依赖系统(如 3.362103e-4932 ) |
LDBL_MAX | 最大有限值 | 依赖系统(如 1.189731e+4932 ) | |
LDBL_EPSILON | 机器 epsilon(最小可表示差值) 即 1.0 与比 1.0 大的最小可表示长双精度浮点数之间的差值,用于长双精度浮点数的高精度计算 | 依赖系统(如 1.084202e-19 ) |
- 机器 epsilon 是浮点数格式的最小上界,使得 1.0 + ε > 1.0 为真。它反映了浮点数的相对精度。典型用途如下:
- 浮点数比较(判断近似相等性)。
- 数值算法的误差分析。
- 避免浮点运算中的累积误差问题。
6 ASCII 码
ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种用于表示文本字符的字符编码标准。它总共规定了 128 个字符的编码。
在 ASCII 码体系中,不同字符对应着特定的十进制和二进制编码。例如:
- 空格字符 “SPACE” 的 ASCII 码值为 32,其二进制表示为 0010 0000。
- 数字字符 0 的 ASCII 码值为 48,二进制表示为 0011 0000。
- 大写字母 A 的 ASCII 码值为 65,二进制表示为 0100 0001。
- 小写字母 a 的 ASCII 码值为 97,二进制表示为 0110 0001。
通过 ASCII 码,计算机能够以统一的方式存储、处理和传输文本字符,确保不同系统之间文本信息的准确交互。
7 编程练习
7.1 字符输出与格式化
定义三个 char 变量,分别存储字母、数字和符号,然后使用 printf 格式化输出它们的值和 ASCII 码。
#include <stdio.h>int main()
{char letter = 'B';char digit = '7';char symbol = '@';printf("字母: %c (ASCII: %d)\n", letter, letter); // 字母: B (ASCII: 66)printf("数字: %c (ASCII: %d)\n", digit, digit); // 数字: 7 (ASCII: 55)printf("符号: %c (ASCII: %d)\n", symbol, symbol); // 符号: @ (ASCII: 64)return 0;
}
程序在 VS Code 中的运行结果如下所示:
7.2 固定字母大小写转换
定义一个 char 变量存储大写字母 'A',通过算术运算将其转换为小写字母 'a' 并输出。再定义一个 char 变量存储小写字母 'z',通过算术运算将其转换为大写字母 'Z' 并输出。
#include <stdio.h>int main()
{// 大写字母 'A' 转小写字母 'a'char upper = 'A';upper = upper + 32; // ASCII 码 +32printf("大写 'A' 转换为小写: %c\n", upper); // 输出 'a'// 小写字母 'z' 转大写字母 'Z'char lower = 'z';lower = lower - 32; // ASCII 码 -32printf("小写 'z' 转换为大写: %c\n", lower); // 输出 'Z'return 0;
}
- 掌握大小写字母的转换方法(大写字母的 ASCII 码 +32 得到小写字母,反之 -32)。
程序在 VS Code 中的运行结果如下所示:
7.3 字符与数字的混合运算
- 定义一个 char 变量存储数字字符 '5',通过算术运算将其转换为整数 5 并输出。
- 定义一个 int 变量存储整数 3,通过算术运算将其转换为字符 '3' 并输出。
- 对字符 '5' 和整数 3 进行混合运算(如相加),并分别以字符和整数形式输出结果。
#include <stdio.h>int main()
{// 数字字符 '5' 转整数 5char digit_char = '5';int digit_int = digit_char - '0'; // ASCII 码相减printf("字符 '%c' 对应的整数: %d\n", digit_char, digit_int); // 输出 5// 整数 3 转字符 '3'int num = 3;char num_char = num + '0'; // ASCII 码相加printf("整数 %d 对应的字符: %c\n", num, num_char); // 输出 '3'// 混合运算char mixed_char = digit_char + num; // '5' + 3 = '8'// 以 %c 和 %d 输出结果printf("混合运算结果(字符:): %c\n", mixed_char); // 输出 '8'printf("混合运算结果(整数:): %d\n", mixed_char); // 输出 56(53+3)return 0;
}
程序在 VS Code 中的运行结果如下所示:
7.4 字符的对称转换
定义一个 char 变量存储字母 'd',通过算术运算将其转换为字母表中对称的字母(如 'a' ↔ 'z','b' ↔ 'y','c' ↔ 'x','d' ↔ 'w')并输出。
#include <stdio.h>int main()
{char c = 'd';// 计算对称字母:'a' + ('z' - c)c = 'a' + ('z' - c);printf("字母 '%c' 的对称字母: %c\n", 'd', c); // 输出 'w'return 0;
}
- 对称字母 = 字母表起始位置 + (字母表末尾位置 - 当前字母位置)
程序在 VS Code 中的运行结果如下所示:
7.5 字符的循环偏移
定义一个 char 变量存储字母 'X',通过算术运算将其转换为字母表中后第 5 个字母(如 'X' → 'C',注意字母表的循环)。
#include <stdio.h>int main()
{char c = 'X';// 计算循环偏移:((c - 'A' + 5) % 26) + 'A'// % 是求余数运算符c = ((c - 'A' + 5) % 26) + 'A';printf("字母 '%c' 后第 5 个字母(循环): %c\n", 'X', c); // 输出 'C'return 0;
}
- 偏移后字母 = 'A' + ((当前字母位置 + 偏移量) % 26)
- c - 'A':将字母转换为 0 到 25 的位置。
- + n:向后偏移 n 个位置。
- % 26:处理字母表的循环(超过 'Z' 时回到 'A')。
- + 'A':将位置转换回 ASCII 字符。
程序在 VS Code 中的运行结果如下所示:
相关文章:
15 C 语言字符类型详解:转义字符、格式化输出、字符类型本质、ASCII 码编程实战、最值宏汇总
1 字符类型概述 在 C 语言中,字符类型 char 用于表示单个字符,例如一个数字、一个字母或一个符号。 char 类型的字面量是用单引号括起来的单个字符,例如 A、5 或 #。 当需要表示多个字符组成的序列时,就涉及到了字符串。在 C 语言…...
AlphaEvolve:LLM驱动的算法进化革命与科学发现新范式
AlphaEvolve:LLM驱动的算法进化革命与科学发现新范式 本文聚焦Google DeepMind最新发布的AlphaEvolve,探讨其如何通过LLM与进化算法的结合,在数学难题突破、计算基础设施优化等领域实现革命性进展。从48次乘法优化44矩阵相乘到数据中心资源利…...
比较文本搜索策略 pgsearch、tsvector 和外部引擎
大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! 在应用程序中实现搜索功能时,您需要选择合适的文本搜索方法。本指南比较了 PostgreSQL 的内置搜索引擎tsvector、pg_search扩展…...
58. 区间和
题目链接: 58. 区间和 题目描述: 给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。 输入描述 第一行输入为整数数组 Array 的长度 n,接下来 n 行,每行一个整数,表示数组的元素。随后…...
MySQL中表的增删改查(CRUD)
一.在表中增加数据(Create) INSERT [INTO] TB_NAME [(COLUMN1,COLUMN2,...)] VALUES (value_list1),(value_list2),...;into可以省略可仅选择部分列选择插入,column即选择的列, 如图例可以选择仅在valuelist中插入age和id如果不指…...
SQL练习(6/81)
目录 1.寻找连续值 方法一:使用自连接(Self-Join) 方法二:使用窗口函数(Window Functions) 2.寻找有重复的值 GROUP BY子句 HAVING子句 常用聚合函数: 3.找不存在某属性的值 not in no…...
Android 中 打开文件选择器(ACTION_OPEN_DOCUMENT )
在 Android 中,打开文件选择器(File Picker)通常是指启动一个系统提供的界面,让用户可以选择存储在设备上的文件。可以通过发送一个带有 Intent.ACTION_OPEN_DOCUMENT 或 Intent.ACTION_GET_CONTENT 的 Intent 来实现。 1、启动文…...
AWS中国区CloudFront证书管理和应用指南
在AWS中国区使用CloudFront时,SSL/TLS证书的管理和应用是一个重要的环节。本文将详细介绍如何在AWS中国区上传、管理和应用SSL证书到CloudFront分配。 1. 准备证书文件 首先,我们需要准备好SSL证书相关的文件。通常,这包括: 私钥文件(.key)公钥证书文件(.crt)证书链文…...
Python之三大基本库——Matplotlib
好久没来总结了,今天刚好有时间,我们来继续总结一下python中的matplotlib 一、什么是Matplotlib Matplotlib是一个Python的2D绘图库,主要用于将数据绘制成各种图表,如折线图、柱状图、散点图、直方图、饼图等。它以各种硬拷贝…...
随笔:hhhhh
第一题 ∫ − ∞ ∞ x e x − e x d x ∫ 0 ∞ ln t ⋅ e ln t − t ⋅ 1 t d t ∫ 0 ∞ ln t ⋅ e − t ⋅ 1 t ⋅ t d t ∫ 0 ∞ ln t ⋅ e − t d t ψ ( 1 ) − γ \begin{align*} \int_{-\infty}^{\infty}xe^{x-e^x}\text{d}x&\int_{0}^{\infty}…...
计算机网络-----6分层结构
目录 “分层” 的设计思想: 计算机网络要完成的功能: 计算机网络的分层结构: 网络体系结构的概念: 各层之间的关系: 数据的传输过程 水平视角: 垂直视角: 相关概念 协议三要素&#x…...
初识SOC:RK3588
目录 一、高性能计算与边缘计算 二、多媒体处理与显示 三、图形与游戏开发 四、物联网与嵌入式系统 五、操作系统兼容性 RK3588作为瑞芯微推出的高性能处理器,凭借其多核架构、高算力NPU和多媒体处理能力,可广泛应用于以下领域: 一、高…...
卡顿检测与 Choreographer 原理
一、卡顿检测的原理 卡顿的本质是主线程(UI 线程)未能及时完成某帧的渲染任务(超过 16.6ms,以 60Hz 屏幕为例),导致丢帧(Frame Drop)。检测卡顿的核心思路是监控主线程任务的执行时…...
第十天——贪心算法——深度总结
文章目录 贪心算法深度解析:原理与应用 1. 贪心算法的基本原理 1.1 贪心选择性质 1.2 最优子结构 1.3 贪心算法与动态规划的对比 2. 贪心算法的应用场景 3. 具体应用案例 3.1 分配饼干 (Assign Cookies) 3.2 分糖果 (Candy Distribution) 3.3 种花问题 (C…...
python自学笔记2 数据类型
字符串操作 f字符串: for index, char in enumerate(greeting_str):print(f"字符:{char}, 索引:{index}")f字符串可以方便的在字符串中插入变量 字符串切片 指定步长: print(greeting_str[::2])指定步长为2的取字符…...
nacos配置文件快速部署另一种方法
提交nacos配置的另一种一种方法,批命令/shell: 以下脚本直接把当前目录下的所有yaml文件一键提交到nacos上 前提是要先安装curl 以及 jq 然后 把下面的shell保存为 import-all.sh 然后 chmod x import-all.sh && ./import-all.sh 就好了. 记得修改一下的NAMESPACE_…...
RTK哪个品牌好?2025年RTK主流品牌深度解析
在测绘领域,RTK 技术的发展日新月异,选择一款性能卓越、稳定可靠的 RTK 设备至关重要。2025 年,市场上涌现出众多优秀品牌,本文将深入解析几大主流品牌的核心竞争力。 华测导航(CHCNAV):技术创…...
游戏引擎学习第285天:“Traversables 的事务性占用”
回顾并为当天的工作做准备 我们有一个关于玩家移动的概念,玩家可以在点之间移动,而且当这些点移动时,玩家会随之移动。现在这个部分基本上已经在工作了。我们本来想实现的一个功能是:当玩家移动到某个点时,这个点能“…...
HNUST湖南科技大学-安卓Android期中复习
使用说明:除了选择判断就看习题外,推荐重点复习三四章多复习案例,这里应该是编程空题,把界面控件、活动单元熟悉一下。第五章(数据存储方式,尤其是文件存储)、第六章(重点内容提供者…...
一种应用非常广泛的开源RTOS(实时操作系统):nuttx
什么是NuttX? NuttX(读音接近“纳特-艾克斯”)是一种应用非常广泛的开源RTOS(实时操作系统),由Gregory Nutt博士主要推动开发。RTOS,即 Real-Time Operating System,直译为“实时操…...
WebSocket 客户端 DLL 模块设计说明(基于 WebSocket++ + Boost.Asio)
WebSocket 客户端 DLL 模块设计说明(基于 WebSocket Boost.Asio) 📌 目录 一、模块总览二、导出接口说明(EXPORTS)三、状态变量功能解读四、连接启动流程详解五、事件回调说明六、消息发送流程七、心跳与断连 JSON …...
微信小程序:封装request请求、解决请求路径问题
一、创建文件 1、创建请求文件 创建工具类文件request.js,目的是用于发送请求 二、js接口封装 1、写入接口路径 创建一个变量BASE_URL专门存储api请求地址 2、获取全局的token变量 从缓存中取出token的数据 3、执行请求 (1)方法中接收传递的参数 function request(url,…...
Ubuntu24.04 安装 5080显卡驱动以及cuda
前言 之前使用Ubuntu22.04版本一直报错,然后换了24.04版本才能正常安装 一. 配置基础环境 Linux系统进行环境开发环境配置-CSDN博客 二. 安装显卡驱动 1.安装驱动 按以下步骤来: sudo apt update && sudo apt upgrade -y#下载最新内核并安装 sudo add…...
Jenkins的流水线执行shell脚本执行jar命令后项目未启动未输出日志问题处理
现象 在流水线里配置了启动脚本例如,nohup java -jar xxx.jar >nohup.out 2>&1 & 但是在服务器发现服务并未启动,且nohup日志里没输出日志,这样的原因是jenkins在执行完脚本后,就退出了这个进程。 解决 在启动脚本执行jar命令的上一步…...
Core Web Vitals 全链路优化:从浏览器引擎到网络协议深度调优
Core Web Vitals 全链路优化:从浏览器引擎到网络协议深度调优 一、浏览器渲染引擎级优化 1.1 合成器线程优化策略 • 分层加速:通过will-change属性创建独立的合成层 .accelerated {will-change: transform;backface-visibility: hidden; }• 光栅化策略调整:使用image-r…...
【网络编程】十、详解 UDP 协议
文章目录 Ⅰ. 传输层概述1、进程之间的通信2、再谈端口号端口号的引出五元组标识一个通信端口号范围划分常见的知名端口号查看知名端口号协议号 VS 端口号 3、两个问题一个端口号是否可以被多个进程绑定?一个进程是否可以绑定多个端口号? 4、部分常见指令…...
求职困境:开发、AI、运维、自动化
文章目录 问:我的技术栈是web全栈(js,css,html,react,typscript),C开发,python开发,音视频图像开发,神经网络深度学习开发,运维&#…...
如何将数据从一部手机传输到另一部手机 | 5 种便捷传输方式
更换新手机可能是一种令人兴奋的体验,但您仍然需要解决问题 - 如何将数据从一部手机传输到另一部手机。幸运的是,有多种方法可以简化此过程,从一键式解决方案到基于云的传输。本文探讨了五种流行的技术来帮助您无缝迁移数据。 第 1 部分&…...
GEE计算 RSEI(遥感生态指数)
🛰️ 什么是 RSEI?为什么要用它评估生态环境? RSEI(遥感生态指数,Remote Sensing Ecological Index) 是一种通过遥感数据计算得到的、综合反映区域生态环境质量的指标体系。 它的设计初衷是用最少的变量&…...
k8s监控方案实践补充(二):使用kube-state-metrics获取资源状态指标
k8s监控方案实践补充(二):使用kube-state-metrics获取资源状态指标 文章目录 k8s监控方案实践补充(二):使用kube-state-metrics获取资源状态指标一、Metrics Server简介二、kube-state-metrics实战部署1. 创…...
JavaScript:PC端特效--元素可视区client系列
一、client系列 client翻译过来就是客户端,我们使用client系列的相关属性来获取元素可视区的相关信息。通过client系列的相关属性可以动态的得到该元素的边框大小、元素大小等。 client系列属性作用element.clientTop返回元素上边框的大小element.clientLeft返回元…...
Centos7 中 Docker运行配置Apache
1、拉去httpd镜像(不加版本号,默认拉最新版本) docker pull httpd 2、运行httpd docker run -di --name httpd-test -p 8080:80 httpd 3、创建文件夹后边做映射 mkdir -p /Docker/apache/www /Docker/apache/logs /Docker/apache/conf 4、…...
PostgreSQL中的全页写
一、概述 在PGSQL数据库中,默认的页面大小为8KB,但是磁盘buffer的大小为4KB,扇区大小为512B。这就导致在操作系统的角度看数据库的写操作,其实并不是一种原子操作。如果操作系统发生了系统级别的故障,此时正好操作系统…...
对称二叉树的判定:双端队列的精妙应用
一、题目解析 题目描述 给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的: 1/ \2 2/ \ / \ 3 4 4 3而 [1,2,2,null,3,null,3] 则不是镜像对称的: 1/ \2 2\ \3 3问题本质 判断一棵二叉…...
Redis + ABP vNext 构建分布式高可用缓存架构
🚀 Redis ABP vNext 构建分布式高可用缓存架构 🔧 环境准备 开发环境 .NET 8.0 SDKVisual Studio 2022 / VS CodeDocker & Docker Compose NuGet 包 Volo.Abp.Caching.StackExchangeRedis v8.1.5Volo.Abp.DistributedLocking.StackExchangeRedis v…...
jvm第一篇《内存与垃圾回收》学习笔记第一章jvm初始
jvm是虚拟机的通称。 java实际默认的应用是hotspot(基于栈的指令集架构) 注:注意区分寄存器的指令集和栈指令集的架构。(大概理解java移植性好就是因为是栈指令集) jvm虚拟机,具有跨语言功能࿰…...
MySQL——3、数据类型
数据类型 1、数据类型分类2、数值类型2.1、tinyint类型2.2、bit类型2.3、小数类型2.3.1、float2.3.2、decimal 3、字符串类型3.1、char3.2、varchar3.3、char和varchar比较3.4、日期和时间类型3.5、enum和set 1、数据类型分类 2、数值类型 2.1、tinyint类型 首先创建t1表&…...
Flutter - 集成三方库:日志(logger)
日志 使用print方法时,会提示 添加依赖 $ flutter pub add logger下载依赖 $ flutter pub get使用 打印 import package:logger/logger.dart;var logger Logger(); logger.d("debug"); logger.e("error"); logger.i("info"); logger.f(&qu…...
第五部分:第五节 - Express 路由与中间件进阶:厨房的分工与异常处理
随着你的 Express 应用变得越来越大,所有的路由和中间件都写在一个文件里会变得难以管理。这时候就需要将代码进行拆分和组织。此外,一个健壮的后端应用必须能够优雅地处理错误和一些常见的 Web 开发问题,比如跨域。 路由模块化 (express.Ro…...
国标GB/T 12536-90滑行试验全解析:纯电动轻卡行驶阻力模型参数精准标定
摘要 本文以国标GB/T 12536-90为核心框架,深度解析纯电动轻卡滑行试验的完整流程与数据建模方法,提供: 法规级试验规范:从环境要求到数据采集全流程详解行驶阻力模型精准标定:最小二乘法求解 ( FAv^2BvC ) 的MATLAB实…...
组件导航 (Navigation)+flutter项目搭建-混合开发+分栏
组件导航 (Navigation)flutter项目搭建 接上一章flutter项目的环境变量配置并运行flutter 上一章面熟了搭建flutter并用编辑器运行了ohos项目,这章主要是对项目的工程化改造 先创建flutter项目,再配置Navigation 1.在开发视图的resources/base/profi…...
物联网中的WiFi模式解析:AP、STA与混合模式
物联网现在还是比较火的,各种设备都要联网,那么WiFi已成为设备联网的“标配”。但你是否想过,为什么有的设备能自己创建WiFi热点,有的只能连接路由器?为什么有些网关既能收数据又能传数据? 主要还是因为Wi…...
spring cloud gateway 源码解析
参考:Spring Cloud Gateway SpringCloud gateway源码走读(顺带聊聊响应式) - 掘金 1,原理图 还是从starter 开始看 要实现网关的核心概念, 肯定是需要接受请求的server ,从上面的截图看 starter-gateway 只负责了包的依赖,并没有定义自动配置 , 他依赖了starter-webf…...
游戏引擎学习第286天:开始解耦实体行为
回顾并为今天的内容定下基调 我们目前正在进入实体系统的一个新阶段,之前我们已经让实体的移动系统变得更加灵活,现在我们想把这个思路继续延伸到实体系统的更深层次。今天的重点,是重新审视我们处理实体类型(entity type&#x…...
【论文阅读】KIMI K1.5: SCALING REINFORCEMENT LEARNING WITH LLMS
KIMI K1.5: SCALING REINFORCEMENT LEARNING WITH LLMS Scaling的解释: 通过系统性的方法扩展强化学习算法的能力,使其能够处理更复杂的问题、更大的状态/动作空间、更长的训练周期或更高效的资源利用 原文摘要: 研究背景与问题定位 传统预训…...
大语言模型与多模态模型比较
一、核心差异:输入数据类型与模态融合 输入数据类型 LLM:仅处理文本数据,例如文本分类、机器翻译、问答等任务,通过大规模语料库学习语言规律。 LMM:支持文本、图像、音频、视频等多种模态输入,例如根据图…...
vscode debug node + 前端
方法 2:调试全栈(Node 前端) 如果需同时调试后端和前端: 分别启动两个调试会话 一个配置调试 Node.js 后端(server.js)。 另一个配置调试浏览器前端(如上)。 {// Use IntelliS…...
RK3568-鸿蒙5.1与原生固件-扇区对比分析
编译生成的固件目录地址 ../openharmony/out/rk3568/packages/phone/images鸿蒙OS RK3568固件分析 通过查看提供的信息,分析RK3568开发板固件的各个组件及其用途: 主要固件组件 根据终端输出的文件列表,RK3568固件包含以下关键组件&#x…...
Java线程池(Thread Pool)性能优化解析
在高性能、高并发的Java应用开发中,线程池(Thread Pool)是不可或缺的组件。它通过复用线程,避免了线程频繁创建和销毁带来的资源开销,提高了系统的响应速度和稳定性。然而,不合理的线程池配置和使用方式也可能成为系统性能瓶颈的根源。 本文旨在深入解析Java线程池的性能…...
AI重塑未来学者:研究生教育的“进化论”与“数字化生存指南
目录: 一、引言:AI浪潮下的“象牙塔”新挑战与新机遇 二、AI的“双刃剑”:深度剖析对研究生教育的颠覆性影响 1. 研究范式的革新:从“人工”到“智能” 2. 知识获取与传授方式的重塑 3. 创新能力与批判性思维的再定义 4. 伦理困境与学术诚信的新考验 三、他山之石:发达国家…...