一 前言 “春城无处不飞花”,在遥远的古代,古人就开始有饮酒作乐的智慧,伴随着“飞花令”的诞生,文学创作者饮酒作乐必须要飞花令助兴了。 bot: 好的,我们可以玩飞花令游戏。 you: 这是飞花令游戏 bot: 对不起,我误解了你的意思。让我们继续玩飞花令游戏吧!请说出下一个含有“月”字的词语或诗句: 回答:“但愿人长久”。 接下去的飞花令你来定吧。 you: 说一个 以鸟为关键词的飞花令游戏 bot: 好的,让我们来一场以鸟为关键词的飞花令游戏。 接下去的飞花令你来定吧。 you: exit 我们可能需要进一步训练这个工具才能让他成为一个飞花令高手。
* p = arr; int i = 0; for (i = 0; i < 5; i++) { *p = 5; //将指针p指向的当前地址的值改为5 p++; } = {1, 2, 3, 4, 5}; // 定义一个包含5个整数的数组 // 定义并初始化数组指针 // int (*ptr)[5] 表示ptr是一个指针,指向包含5个整数的数组 ————指向整个数组的指针 指针数组 int *p[5]————包含5个整型指针的数组 特性 数组指针 指针数组 定义 int (*ptr)[n] int *ptr[n] 本质 指向数组的指针 = { {1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7} }; test(arr, 3, 5); return 0; } 总结:二维数组传参,形参部分可以是数组形式,也可以是指针形式 除法 (/)\n"); printf("5.
size_t n) 3️⃣ memset(void *ptr, int value, size_t n) 4️⃣ memcmp(const void *a, const void *b, size_t n) 5️⃣ char buf[10]; memset(buf, 'A', 5); buf[5] = '\0'; printf("%s\n", buf); // 输出 AAAAA www空间卷轴:memset ; char b[] = "abd"; int result = memcmp(a, b, 3); printf("%d\n", result); // 输出负数 空间卷轴:memcmp函数 5️⃣ ; // 源: data[0] 开始的5个字节 "abcde" // 目标: data[2] 开始的5个字节 初始: a b c d e f g h i \0 步骤: a b a d e f g h i *(data+5) = *(data+3); // data[5] = 'b' → "abababghi" *(data+6) = *(data+4); // data[6] = 'a' → "abababa
• 5表⽰每一行有5个元素 • int 表⽰数组的每个元素是整型类型 • arr 是数组名,可以根据自己的需要指定名字 data数组意思基本⼀致。 ⼆维数组的初始化 (1)不完全初始化 int arr1[3][5] = {1, 2}; int arr2[3][5] = {0}; (2)完全初始化 int arr3[3][5] = {1,2,3,4,5 , 2,3,4,5,6, 3,4,5,6,7}; (3)按照行初始化 int arr4[3][5] = {{1,2},{3,4},{5,6}}; 注意 初始化时省略行,但是不能省略列 二维数组的使用 ⼆ C语言规定,⼆维数组的⾏是从0开始的,列也是从0开始的,如下所⽰: int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7}; 二维数组的输入与输出 #include <stdio.h> int main() { int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7}; int i = 0;//遍历⾏ //输⼊ for(
字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储 ,也可以使⽤二进制形式存储 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占⽤5个字节(每个字符⼀个字节),⽽
人与人交流的是自然语言,如:汉语、英语、日语 那人与计算机交流就得用计算机语言 C语言就是众多编程语言中的一种,是一种底层语言
转义字符是编程中用于表示特殊符号或功能的字符序列,通常以反斜杠(\)开头。例如:\n(换行)、\t(制表符)、\(反斜杠)、"(双引号)等。它们帮助在字符串中插入无法直接输入的字符,增强代码的灵活性和可读性。
int b return a + b; // 返回计算结果 } (2)函数的调用 //函数定义后,可以通过 `函数名 + 参数` 调用: int result = add(3, 5) ; // 调用 add(),传入 3 和 5 printf("3 + 5 = %d\n", result); // 输出: 3 + 5 = 8 //无返回值函数的调用 greet(); // 调用 代码展示 int main() { int arr[5] = {1, 2, 3, 4, 5}; printArray(arr, 5); // arr在这里退化为指向首地址的指针 = {1, 2, 3, 4, 5}; printArray(a, 5); // 两个实参:数组名 + 数组大小 return 0; } • 函数的实参是数组,形参也是可以写成数组形式的 = {1, 2, 3, 4, 5}; clearArray(data, 5); // data数组被清空 return 0; } 代码练习 #include <stdio.h> int
signed int si; // 有符号整型(默认) unsigned int ui; // 无符号整型 3) 限定符 const int MAX = 100; // 常量,不可修改 5. 变量的作用域 1)局部变量 概念: 在函数或代码块内部定义的变量 void function() { int localVar = 5; // 局部变量 // ... } 2)全局变量 ) 联合体变量 union Data { int i; float f; char str[20]; }; union Data data; // 联合体变量 5) 平方后返回结果 分解解释: #define:预处理指令,用于定义宏 SQUARE(x):宏名称为SQUARE,带有一个参数x ((x)*(x)):宏的展开内容,计算x乘以x int num = 5; int result = SQUARE(num); // 展开为:((num)*(num)) → 5*5 = 25 2.
前言 上一篇文章收集飞花令碎片——C语言分支与循环结构(上)已经跟大家全面讲解了分支与循环的基础知识,这一张会通过几个程序设计项目来锻炼逻辑思维能力,难度从难到易,大家可以根据自己的需求去练习 练习一 第二个 && 的操作数是 3(真),继续计算 d++: d++:先使用 d 的值 4,然后 d 自增为 5。d++ 的返回值是 4(非零,真)。 d 已经自增为 5。 c 未被修改。 输出: a = 2 b = 3 c = 3 d = 5 代码2 #include <stdio.h> int main() { int i = 0, a = 1, b = 2, c = 3, d = 4 main() { int day = 0; scanf("%d", &day); switch(day) { case 1: case 2: case 3: case 4: case 5:
表达式语句(例如 y=x+3;假设变量y和x均已定义) (2)函数调用语句(MAX(x,y);假设函数MAX()已经定义) (3)控制语句 (4)复合语句(把多种语句复合在一起形成的语句) (5) while (1) { if (x == 5) break; // 退出循环 } 流程图演示 (2)continue 作用: 跳过当前循环的剩余部分,进入下一次迭代。
重难点:对数组指针与函数指针的重命名 数组指针重命名 比如我们有数组指针类型 int(*)[5] ,需要重命名为 parr_t,那可以这样写: typedef int(*parr_t)[5]; //新的类型名必须在 *的右边 一维数组指针重命名 #include <stdio.h> int main() { int arr[5] = {10, 20, 30, 40, 50}; // 为" 指向包含5个int的数组的指针"创建别名 typedef int (*IntArray5Ptr)[5]; // 使用该类型声明指针 IntArray5Ptr ptr = ; } 遍历二维数组 #include <stdio.h> int main() { int matrix[2][3] = { {1, 2, 3}, {4, 5, 3)); func = subtract; printf("减法结果: %d\n", func(5, 3)); return 0; }
; } 5、注意问题 使用%s时要小心缓冲区溢出 可以指定最大读取长度 char name[20]; scanf("%19s", name); // 最多读取19个字符,留1个给'\0' scanf
,虽然我们有时候用不到,但这却是我们必须要做的 3、字符串的初始化 方式 示例 说明 直接赋值 char s[] = "abc"; 自动计算长度并补 '\0'(长度=4) 指定大小 char s[5] 代码示例: char *ptr = "Hello"; printf("%p\n", (void *)ptr); // 输出指针地址(如 0x55a1b2c3d4e5) 后面我们讲到指针的时候会深度解析 代码示例: int count; printf("Hello%nWorld\n", &count); // count = 5("Hello"的长度) 3. 内存复制) void memcpy(char dest[], const char src[], size_t num); 功能:从src数组复制num个字节到dest数组 代码示例: int src[5] = {1,2,3,4,5}; int dest[5]; memcpy(dest, src, sizeof(src)); // 复制整个数组 3、内存查找函数 (1) strchr(查找字符位置) int
写在前面 在2018年下半年的某一天,偶然观看了《中国诗词大会》节目的飞花令环节。 实现语音版飞花令仅作为兴趣爱好,之前本来是用 Django 完成的,在朋友的安利之下改用 Sanic 重写。 飞花令 整体架构如图所示 ? 架构如上图所示,接下来分享部分技术细节。 最后 以上是关于飞花令应用的总结,总的来说还是挺满意这次实践。 有希望继续改进的同学可以在 github 上 fork 飞花令代码库进行二次开发。
8^4 = 4096 5 5 * 8^4 第6位 8^5 = 32768 6 6 * 8^5 第7位 8^6 = 262144 7 7 * 8^6 第8位 8^7 = 2097152 0 0 * 8^ 3 + 4 * 5; 上⾯⽰例中,表达式 3 + 4 * 5⾥⾯既有加法运算符( +),⼜有乘法运算符(*)。由于乘法 的优先级⾼于加法,所以会先计算4 * 5,⽽不是先计算3 + 4。 5 * 6 / 2; 上⾯⽰例中, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执⾏,先计算 5 * 6 , 再计算 / 2 。 if(month >= 3 && month <= 5) 表达式中&& 的左操作数是 month >= 3 ,右操作数是 month <= 5 ,当左操作数 month >= 3 的结果是0的时候, 即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季)。
、换行\n、回车\r、水平制表符\t、垂直制表符\v isspace(' ') → 真isspace('A') → 假 isdigit 检查字符是否为十进制数字 '0' ~ '9' isdigit('5' return 0; } #include <stdio.h> #include <ctype.h> int main() { char ch1 = 'a', ch2 = 'B', ch3 = '5' int result = strncmp(str1, str2, 5); printf("前5字符比较: %d\n", result); // 0(相同) // 比较前 // 注意:不是所有数字都有对应的错误描述,有些可能是"Unknown error" for (int i = 0; i < 5; i++) { // 对每个错误代码i ; fwrite(data, 1, strlen(data), file); 5. fgetc() 从文件中读取一个字符。
自动内存 (Automatic / Stack) void my_func() { int local_var = 5; } 函数里的局部变量,放在“栈”上。 = NULL) { my_array[0] = 5; // 这段代码就不会执行了 } 3.3)重复释放 “同一张账单付了两次钱。”
} temp_stu; 2.2)结构体的初始化 #include <stdio.h> struct Stu { char name[20];//名字 int age;//年龄 char sex[5] 5)结构体作为函数返回值 首先来看一个简单的例子,如何直接将结构体作为函数返回值: #include <stdio.h> // 定义一个结构体类型 Point,表示二维平面上的点 struct Point / 占 1 字节,偏移量 0 int i; // 占 4 字节,按 pack(1) 不再对齐,紧跟在 c1 后,占偏移量 1~4 char c2; // 占 1 字节,偏移量 5 6 return 0; } 成员 字节范围 说明 c1 0 char,占 1 字节 i 1–4 int,占 4 字节(紧接在 c1 后,因为 #pragma pack(1) 取消对齐) c2 5 或 signed int,在 C99 中位段成员的类型也可以选择其他整型家族类型,比如:char 位段的成员名后边有一个冒号和一个数字 struct A { int _a:2; int _b:5;
255 %hhu 每一种变量举例 char ch1 = 'A'; // 字符赋值 char ch2 = 65; // 等效于'A'的ASCII值 char ch3 = -5; n", ch1); // 输出: A printf("整数值: %hhd\n", ch2); // 输出: 65 printf("可能的有符号值: %hhd\n", ch3); // 可能是-5 // 默认double类型 long double ld = 3.1415926535L; // L后缀表示long double // 科学计数法 double sci = 1.23e-5; 元素数量或逻辑长度 获取方式 sizeof(静态类型) .length/.size()/len() 适用场景 内存管理、二进制操作 逻辑操作(如遍历、切片) 代码示例 // C 示例 int arr[5] ; printf("Size: %zu\n", sizeof(arr)); // 输出:20(假设int为4字节,5*4=20) printf("Length: %zu\n", sizeof(arr)/