C语言
文章平均质量分 53
帝国无伤
这个人很懒,什么都没没留~
展开
-
【C语言】负数取模、取余
如果a和d是两个自然数,d非零,可以证明存在两个整数 q 和 r,满足 a = q*d + r ,且0 ≤ |r| < |d|。其中,q 被称为商,r 被称为余数。可以看到,在不同语言中计算同一个表达式,负数“取模”结果是不同的。所以在对其商进行取整的时候,向0取整和向-∞方向取整的值都一样,这样子的话:取模的值 = 取余的值。经过上面的例子,我们已经知道了取模(余)的本质是要先计算出商是多少,而商的值取决于商的取整规则。取决于除法计算的时候,取整规则。同符号数据相除,得到的商,一定是正数,即大于0!原创 2023-05-16 11:37:21 · 1591 阅读 · 0 评论 -
【C语言】深入理解注释
复杂的函数中,会有很多分支、循环的嵌套,如果它们的行数也有很多的话,我们在阅读的时候容易搞混,不知道哪个循环或分支从哪里开始或者是从哪里结束。我们知道一个源文件要变成可执行程序的话,首先要经过预处理,预处理阶段完成的任务包括:头文件展开、宏替换、条件编译、去掉注释。,因为 / 会优先与 * 结合作为一个注释符号。正确的写法应该是在 / 后面加上一个空格或者对 *p 加上一个括号。所以建议在分支语句、循环语句结束之后加上注释,这样方便区分各分支或循环体。下面C风格注释的使用是错误的,原创 2023-05-06 17:02:52 · 456 阅读 · 0 评论 -
【C语言】struct结构体
在C中,结构体内只能存放各种类型的变量,不能存函数:像上面这样就是声明了一个结构体,此时的相当于一个类型名。补充:C 和 C++ 中定义结构体变量的区别在 C 中使用结构体去定义变量时,需要在结构体名称前加上 struct 关键字。在 C++ 中使用结构体去定义变量时,可以不加 struct 关键字在 c99 中有明确的规定允许结构体中最后一个数组大小是未知的。char b;//或者int arr[0];struct T t;原创 2023-04-29 11:43:36 · 13394 阅读 · 1 评论 -
【C语言】大小写字母判断、转化函数总结
函数的功能是把大写的英文字母转换为小写的英文字母,如果转化成功则放回小写字母的ASCLL码,否则返回原字符的ASCLL码。函数用来判断一个字符是否为小写字母(‘a’ ~ ‘z’),是则输出非零,否则输出零。函数用来判断一个字符是否为大写字母(‘A’ ~ ‘Z’),是则输出非零,否则输出零。函数用于判断字符是否为数字字符(‘0’ ~ ‘9’),是则输出非零,否则输出零。函数用来判断一个字符是否为字母,如果是字母则返回非零,否则返回零。函数用来判断一个字符是否为数字或字母,是则输出非零,否则输出零。原创 2023-04-27 11:36:31 · 3079 阅读 · 0 评论 -
【C语言】void 和 void* 类型
任何平台、任何编译器,都是可以定义 void* 类型的指针变量的。使用 sizeof 计算 void* 的大小:可以发现 void* 的大小和其他类型指针变量的大小一样,都是4个字节。原创 2023-04-14 19:20:21 · 1031 阅读 · 0 评论 -
【C语言】break 和 continue 的理解
continue 只能在循环中使用。作用是结束本轮循环,然后直接到新的下一轮。中使用,作用是退出最近的循环或switch语句。原创 2023-04-09 10:42:43 · 130 阅读 · 0 评论 -
【C语言】为什么推荐把for循环写成左闭右开区间
循环十次打印"hello world",判定条件通常有两种写法:左闭右开区间、左闭右闭区间。:我们通常会把循环条件初始化为0,这时如果把判断条件写成开区间的话可以一眼看出循环多少次。:即使循环条件不是从0开始的,左闭右开区间依然更方便计算循环次数。:循环次数明确,方便结合容器长度来遍历容器数据。原创 2023-04-09 10:18:37 · 252 阅读 · 0 评论 -
【C语言】switch语句的理解
下面代码在 case 语句中定义了一个 n 变量break;} return 0;编译器会报错:case 1 : {int n = 10;} break;} return 0;编译器就不会报错,原因如下:C++编译器考虑了如下的情况:倘若在case 1中定义了一个变量,由于case 1和 default 都在同一个作用域,因此 default 可以调用case 1的变量;原创 2023-04-08 22:11:04 · 1016 阅读 · 0 评论 -
【C语言】char类型的取值范围
每一个bit位可以存0和1两个数字,8个bit位一共有 2^8 种排列方法,即区间 [00000000, 11111111]首先我们知道在 C/C++ 中,char类型大小为1字节,即8bit。的话,表示出来的数据取值范围是 [0, 255]最终输出结果为 255,我们来分析一下为什么。,取值范围是 [-128,127]原创 2023-04-05 22:28:35 · 4251 阅读 · 1 评论 -
【C语言】整形数据的存储和读取过程
首先操作系统看到 a 这个变量的类型是 int,所以会为其在栈中开辟出 4 字节的空间。按理来说 -10 是不能被存入一个无符号类型的变量里的,我们可以说C语言对类型的检查不严格,那么这个 -10 究竟是怎么被存进去的呢?:空间有了之后,就要把数据放入到空间中,需要放入的数据是 -10,不论是正数还是负数,我们都要把它转化成补码,之后才能存入到空间中。:最后一步把数据放入空间时要考虑大小端的问题,现在的电脑大部分都是小端存储,即低权值数据存到高地址,高权值数据存到低地址。PS:大小端存储方案的本质是。原创 2023-04-03 21:48:54 · 420 阅读 · 0 评论 -
【C语言】atoi模拟实现
函数介绍int atoi( const char *string );头文件:stdlib.h功能:将字符串转换成整型数;atoi()会扫描参数string字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换(数字或正负号前面只能有空格,若有其它字符则放回数字0,即失败的情况),而再遇到非数字或字符串时(’\0’)才结束转化,并将结果返回(返回转换后的整型数)。atoi使用案例#include <stdio.h>#include <stdlib.h>int原创 2021-03-27 17:53:42 · 202 阅读 · 2 评论 -
【Linux】文件知识点总结
一. 什么是文件1. 文件基本概念广义上磁盘上的文件都是文件。但在程序设计中我们把文件分为两类:程序文件、数据文件。程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。下面我们讨论的是数据文件。2. 文件标识一个文件要有一个唯一的文件标识,以便用户识别和引用。其中文件标识包括三个部分:文件路径 +原创 2021-10-31 15:33:41 · 3162 阅读 · 0 评论 -
【C语言】offsetof模拟实现
offsetof介绍size_t offsetof( structName, memberName )功能:计算结构体成员相对于起始位置的偏移量返回值:返回结构体成员相对于起始位置的偏移量模拟实现把结构体的初始地址设置为0,此时结构体成员的地址大小就是它所对应的偏移量#define MY_OFFSETOF(structName,memberName) (unsigned int)&(((structName*)0)->memberName)测试#include<st原创 2021-02-26 14:57:29 · 189 阅读 · 0 评论 -
【C语言】通讯录实现
通讯录功能添加联系人信息(名字,性别,年龄,电话号码,家庭住址)输出指定联系人信息查找指定联系人信息修改指定联系人信息打印所有联系人信息对所有联系人(通过名字)排序保存当前通讯录内容(以二进制形式保存到当前文件夹里的contactinformation这个数据文件里)文件分装代码contact.h//声明C库函数的头文件#include<stdio.h>#include<stdlib.h>#include<string.h>#inclu原创 2021-02-24 15:09:07 · 5101 阅读 · 3 评论 -
【C语言】扫雷游戏
说明:该游戏的实现需要建立三个文件test2.c:整个游戏,开始游戏/退出游戏的大体执行流程game2.c:具体实现扫雷游戏功能的函数定义game.h:宏定义,函数声明,引用相关C库函数的头文件test2.c游戏的大体执行流程#include"game2.h"//菜单函数void menu(){ printf("**************************\n"); printf("******** 1.play ********\n"); printf("***原创 2021-02-21 20:18:24 · 136 阅读 · 4 评论 -
【C语言】memcpy 和 memmove 模拟实现
头文件:string.hmemcpyvoid * memcpy( void * dest, const void * src, size_t num )功能:函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。返回值:返回dest。这个函数在遇到 ‘\0’ 的时候并不会停下来如果source和destination有任何的重叠,复制的结果都是未定义的模拟实现#include<stdio.h>#include<ass原创 2021-02-17 16:32:50 · 294 阅读 · 1 评论 -
【C语言】常见字符串函数总结及模拟实现
头文件:string.hstrlensize_t strlen( const char* string )功能:计算字符串中\0之前的字符的个数,不包括\0返回值:字符串中字符的个数参数指向的字符串必须要以’ \0 '结束strlen函数返回的是在字符串中’ \0 ‘前面出现的字符个数(不包含’ \0 ')函数的返回值为size_t,是无符号的(unsigned int)模拟实现#include<stdio.h>//count计数法unsigned int my_原创 2021-02-16 11:22:22 · 261 阅读 · 3 评论 -
数据的存储知识点总结
1.数据类型的意义a.使用这个类型开辟内存空间的1大小(大小决定了适用范围)b.如何看待内存空间的视角2.整数a.b.有符号数整型提升时高位补符号位,无符号数整型提升时高位补03.大端(存储)模式:数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中小端(存储)模式:数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中4.有符号的char的范围是:-128到127无符号的char的范围是:0到2555.浮点数的存储6.浮点数存储时的一些规则a.有效原创 2021-02-15 15:06:47 · 600 阅读 · 0 评论 -
【C语言】三子棋游戏
说明:该游戏的实现需要用到三个文件test.c:放置主函数(main())和菜单函数(menu())和游戏函数(game())。game.c:放置game()里面的相应操作的函数,例如玩家移动(PlayerMove(board)),电脑移动(ComputerMove(board)),以及每一次移动之后打印当前棋盘内容的函数(DisplayBoard(board))等等。由于这些函数内容较多,所以单独放在一个头文件里实现。game.h:放置game.c里面函数的声明,以及需要用到的库函数的头文件(s原创 2021-02-15 12:10:26 · 171 阅读 · 0 评论 -
【C语言】简单计算器
描述:简单的实现四则运算1.switch法#include<stdio.h>void menu()//菜单函数{ printf("************************************\n"); printf("***** 1.add 2.sub *****\n"); printf("***** 3.mul 4.div *****\n"); printf("*********** 0.exit *原创 2021-02-08 11:36:49 · 184 阅读 · 0 评论 -
【C语言】请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序
字节序概念大端存储模式:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。小端存储模式:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。判断当前机器的字节序程序思路:以1这个数为例,得到它第一个字节的内容,若为1就是小段存放;若为0就是大端存放。#include<stdio.h>int check_sys(){ //1的16进制表示为:0x 00 00 00 01 int a = 1; //将&a的类型强制转化为char*类型原创 2021-02-04 22:47:25 · 303 阅读 · 0 评论 -
【C语言】输入一个整数,输出该数二进制表示中1的个数,其中负数用补码表示
方法一:count计数法#include<stdio.h>int count_bit_one(unsigned int num)//负数的源码和补码不相同,所以把负数的二进制补码转化成对应的无符号的源码的数。正数的源码和补码相同。{ //此方法是对一个数的二进制源码进行操作的 int count = 0; while (num) { if (num % 2 == 1) { count++; } num /= 2; } return count;}原创 2021-01-31 15:09:10 · 770 阅读 · 0 评论 -
【C语言】交换两个int变量的值,不能使用第三个变量
题目描述交换两个int变量的值,不能使用第三个变量。即a=3,b=5,交换之后 a=5,b=31.加减法a=a+b;b=a -b;(b变为原来的a)a=a -b;(a变为原来的b)ps:若a+b的值过大,超过整型的范围时可能会溢出,这个方法不再适用。#include<stdio.h>int main(){ int a = 3; int b = 5; printf("a=%d b=%d\n", a, b); a = a + b; b = a - b; a = a原创 2021-01-30 11:47:37 · 995 阅读 · 0 评论 -
【C语言】数组排序方法总结
一.冒泡排序相邻元素两两比较,按照要求交换位置,n个元素一共要比较n-1趟,每趟要两两比较未排序元素个数-1次。#include<stdio.h>void bubble_sort(int* p, int len)//函数实现{ int i = 0; int j = 0; for (i = 0; i < len - 1; i++)//需要进行len-1趟 { int flag = 1;//flag=1,说明已经排好序 for (j = 0; j < len -原创 2021-01-25 17:15:32 · 23132 阅读 · 0 评论 -
【C语言】汉诺塔问题
1.如果a柱只有一个盘子:直接把a柱上的盘子转移到c柱2.如果有a柱一个盘子以上(核心的三部):假如a上有三个盘子2.1 //先把a柱上的n-1个盘子转移到b柱上2.2 //再把a柱上剩下的一个最大的盘子转移到c柱上2.3 //最后把b柱上的n-1个盘子全部转移到c柱上#include<stdio.h>void move(char,char);void hanoi(int, char, char, char);int main(){ int n = 0; pr.原创 2021-01-22 00:22:41 · 300 阅读 · 0 评论 -
【C语言】求n的阶乘(递归法和循环法)
根据阶乘的计算方法:n!= 1 * 2 * 3*…*n,我们在一个for循环完成 n 次乘法运算。注意因为是连乘,最终阶乘结果可能会非常大所以我们在。阶乘规律:当 n=1 时,n!当 n>1 时,n!= n*(n-1)!利用递归得到最终结果。函数中用 long long 类型的变量来记录阶乘的结果。原创 2021-01-21 13:38:59 · 4710 阅读 · 3 评论 -
【C语言】接收一个整数,按照顺序打印它的每一位
方法:利用递归实现代码测试:#include<stdio.h>int print_num(int n){ if (n > 9) { print_num(n / 10); } printf("%d ", n % 10);}int main(){ int num=0; scanf("%d", &num); print_num(num); return 0;}递归过程(假设输入123)......原创 2021-01-19 19:06:07 · 1040 阅读 · 0 评论 -
【C语言】二分法查找的函数实现
函数描述:自定义一个函数,传入数组名,数组元素个数,需要查找的数字,用二分查找实现。找到了返回元素的下标,找不到返回-1函数实现:int binary_search(int* p, int n, int num)//p:数组首元素地址 n:数组的元素个数 num:需要查找的数{ int left = 0;//数组元素左下标 int right = n - 1;//数组元素的右下标 //开始查找,并更新左右下标 while (left <= right) { int mi原创 2021-01-19 12:40:43 · 1716 阅读 · 0 评论 -
【C语言】pow、sqrt函数的模拟实现
函数介绍pow(x,y) ——求x的y次方函数模拟实现普通版:递减n的大小,逐次乘num#include<stdio.h>int my_pow(int num, int n){ if (n != 0) return num * my_pow(num, n - 1); else return 1;}int main(){ printf("%d\n", my_pow(2, 3)); return 0;}优化版:依据n的奇偶性来进行递归处理#incl原创 2021-01-25 11:58:48 · 1797 阅读 · 0 评论 -
【C语言】判断闰年的函数
函数描述:自定义一个函数,传入一个年份n,判断是否为闰年。若是返回1,否则返回0。函数实现:int is_leap_year(int year){ if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) return 1; else return 0;}...原创 2021-01-19 11:37:19 · 6163 阅读 · 0 评论 -
【C语言】判断素数的函数
函数描述:自定义一个函数,传入一个整数n,判断是否为素数。若是返回1,否则返回0。函数实现:int is_prinme(int num){ int i = 0; for (i = 2; i <= sqrt(num); i++)//若是素数一定满足num=a*b,且a,b,至少一个小于等于sqrt(num),所以只用试除到sqrt(num)以前 { if (num%i == 0) { return 0; } } return 1;}ps:sqrt函数需要引用原创 2021-01-19 11:23:42 · 25544 阅读 · 2 评论 -
【C语言】求最大公约数和最小公倍数函数实现
最大公约数:令两个数为a和b(不论顺序)。若b不为0,更新a和b的值:把a/b的余数赋值给b,把b原来的值赋给a。重复操作,直到b=0,此时a为最大公约数。最小公倍数:利用二者的关系(最大公约数最小公倍数=ab),只需求出最大公约数即可。#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int gcd(int a, int b)//求最大公约数函数{ int tem = 0; while (tem = a % b) { a =原创 2021-01-15 23:01:46 · 3390 阅读 · 0 评论