c阶段
mxrrr_sunshine
这个作者很懒,什么都没留下…
展开
-
总结部分string库函数
求字符串长度strlen以‘\0’为结束标志,返回值为‘\0’前的字符个数函数的返回值时无符号int长度不受限制的字符串函数strcpy 源字符串以’\0’为结尾会将源字符串的’\0’拷贝到目标空间里目标空间必须足够大,以确保能够存放源字符串strcat源字符串以’\0’结尾目标空间必须足够大,以确保存放的下源字符串目标空间必须可修改strcmp如何比较:优先比较ascii码原创 2018-03-06 17:23:31 · 211 阅读 · 0 评论 -
c语言:99乘法表+输出素数
c语言输出99乘法表:#include int main(){ int i,j,k; k=i*j; for(i=1;i for(j=1;j printf("%d*%d=%-3d\t",j,i,k); //为什么是%-3d? } printf("\n"); }}输出100—200之间的素数:#include in原创 2017-11-01 20:12:38 · 491 阅读 · 0 评论 -
c语言:解一元二次方程及浮点数的比较
首先,需要确定分支结构,用if else语句结构。 判断a=0?————————yes:输出不是一元二次方程。 no | 判断b^2-4ac=0?——————yes:输出只有一个根,并计算。 no | 判断b^2-4ac>0?———————yes:输出有两个根,并计算。 no | 输出无解用i原创 2017-11-05 21:25:57 · 644 阅读 · 0 评论 -
c语言:多种方法实现两个数的交换
交换两个数的内容是c语言中常见的问题,所以在此总结一下我所学到的几种方法。 首先,举一个例子,假设a=10,b=20. 第一种方法,借助一个临时变量来进行保存,这是最容易也是最直观的方法。 代码如下:int a, b, t; a = 10; b = 20; printf("a=%d b=%d", a, b); t = a; a = b; b =原创 2017-11-11 14:09:17 · 6099 阅读 · 0 评论 -
c语言:用switch模拟售货机
用switch模拟实现售货机: 代码如下:#define _CRT_SECURE_NO_WARNINGS 1int main(){ int b = 0; char good[10][10] = {"巧克力","奶油蛋糕","香葱饼干","雪碧 ","可乐"}; float price[] = { 5, 2.5, 4.5, 3, 3 }; printf("*****原创 2017-11-11 14:39:48 · 1786 阅读 · 1 评论 -
求二进制序列中1的个数及奇偶序列+输出整数的每一位+两个数中多少个bit位不同
题目一:求一个整数的二进制序列中1的个数 分析:首先,我们知道数在内存中是以补码得形式储存的,而正数的原码补码反码都相同。 做法一:int main(){ int count = 0; int num = 0; printf("输入一个数:"); scanf("%d", &num); while (num) { if (num %原创 2017-11-18 15:37:02 · 354 阅读 · 0 评论 -
c编程之乘法表+素数+闰年
乘法表 不局限于99乘法表,而是由我们自定义输入一个行数,输出对应的乘法表,原理与99乘法表相同。int Multip_table(int i,int j){ int k = 0; k = i*j; return k;}int main(){ int i = 0, j = 0; int n = 0; int ret = 0;原创 2017-11-19 22:38:43 · 228 阅读 · 0 评论 -
c程序的内存分配
程序的地址空间用一张图来说明: 说明一下各区域: 栈区:由编译器自动分配释放、存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。 堆区:一般由程序员分配释放,若程序员不释放,程序结束后可能由OS回收。 全局区(静态区):存放全局变量,静态数据,常量。程序结束后由系统释放。 代码区:存放函数体的二进制代码。内存分配方式从静态存储区域分配:内存在程序编译时已经分配好,这块原创 2017-12-06 10:22:17 · 115 阅读 · 0 评论 -
有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
有一个字符数组的内容为:”student a am i”,请你将数组的内容改为”i am a student“ 分析: 思路是这样的,可以先将每个单词逆置,以空格为分界。 再将整个字符串全部逆置。 这里使用数组和指针两种操作,指针更为方便一些。程序1:void Reverse_string(char *s,int left,int right){ while (left < rig原创 2017-12-13 21:03:36 · 424 阅读 · 0 评论 -
函数调用及栈帧详解
我们在写c语言函数时,经常会使用F11调试跳转到函数内部,但是从内存的角度,函数调用实际上是一个怎样的过程呢? 关于栈帧,从逻辑上来说,可以想象成函数调用时的环境,需要考虑函数参数,函数的局部变量,函数执行完返回值等等。 下面详细解释一下函数调用的过程以及栈帧的概念。 首先在VC6.0下写一段简单的程序,#include <stdio.h>#include <windows.h>int M原创 2017-12-06 13:06:58 · 421 阅读 · 0 评论 -
利用栈帧改变变量的值及强行插入第三个函数
利用栈帧 改变另一个变量的值在之前学习了栈帧结构后,我们可不可以不通过某一个变量名来改变该变量的值? 答案是可以的。代码如下:#include <stdio.h>#include <windows.h>int Myadd(int x,int y){ int z=0; int *p=&x; p++; printf("Myadd:%#x\n",*p); *原创 2017-12-06 17:19:51 · 196 阅读 · 0 评论 -
c语言左旋字符串中的k个字符
实现一个函数,可以左旋字符串中的k个字符。 ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB由上面的例子我们可以明白旋转的含义,所以下面直接给出三种接法。方法一: 可以使用循环移位法,比如说字符串ABCD,左旋一次,得到BCDA。 可以先将A取出放在一个临时变量中,然后将后面的字符依次前移一位。此时最后一位就空出来了, 再将第一次放入临时变量中的A放入最后一位。左旋几个字符原创 2017-12-17 15:33:46 · 277 阅读 · 0 评论 -
c语言动态内存管理
malloc函数原型: void* malloc(size_t size)如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针。返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用时由使用者决定。如果参数size为0,malloc函数的行为是标准未定义的,由编译器决定。 因此,在使用malloc函数时,对返回值一点要做检查。既然原创 2018-02-05 18:53:19 · 228 阅读 · 0 评论 -
数据存储相关练习
题目1 char a = -1; signed char b = -1; unsigned char c = -1; printf("a=%d b=%d c=%d\n", a, b, c); 解析:a是char型,默认有符号char,所以存储时八个比特位全1,读取时要进行整形提升,因为是有符号数,所以补符号位1,即32个1。因为是有符号数,存储为补码,读取时要转换为原创 2018-01-25 23:46:41 · 172 阅读 · 0 评论 -
c语言内存管理相关面试题
整理了一些有关内存管理测试题类型一1.#define BUFFER_SIZE 256void GetMemory(char **ppszbuf){ if (NULL == ppszbuf) { assert(0); return 0; } ppszbuf = (char *)malloc(BUFFER_SIZE); //*原创 2018-01-17 12:06:12 · 2171 阅读 · 1 评论 -
c语言指针相关面试题
例1int main(){ int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf("%d %d\n", *(a + 1), *(ptr - 1)); system("pause"); return 0;}程序结果:2 5 分析:数组名在sizeof内部单独出现和&(数组名)这两种原创 2018-01-06 17:09:37 · 1524 阅读 · 0 评论 -
内存对齐
关于结构体,我们都知道要考虑内存对齐问题,但是为什么对齐和如何对齐呢? 这是我们要讨论的两个核心问题。为什么内存对齐根据大部分参考资料:平台原因: 不是所有得到硬件都能访问任意地址上的任意数据的。 某些硬件只能访问特定地址上的特定数据。性能原因: 为了访问未对齐的数据,处理器要进行两次内存访问;已对齐的数据,只需一次访问即可。(举个例子,如果只能兑的整数倍处的地址进行内存访问的话,只有0原创 2018-01-06 16:22:27 · 283 阅读 · 0 评论 -
内存对齐相关面试题
题目一#pragma pack (4) unsigned short* pucchararray[10][10];typedef union unRec{ unsigned long L1; unsigned short S2[7]; unsigned char C3;}REC_S;REC_S stmax, *pstmax;int main(){ prin原创 2018-01-14 20:21:42 · 628 阅读 · 1 评论 -
c语言-注释转换
用c语言实现一个简单的功能-注释转换 首先要了解两种简单的注释形式:c风格注释:/* */c++风格注释://效果如下图所示: 用几张图来说明思路: 首先是两个文件的引入: 各种状态间的转换: 对获取字符的各种可能性判断: 实现代码如下:#include <stdio.h>#include <stdlib.h>#include "convert.h"#pragma war原创 2018-01-13 18:58:44 · 284 阅读 · 0 评论 -
c语言-简易通讯录
在学习完c语言的部分之后,运用了最后学到的有关结构体,枚举,内存管理,文件等知识,写了一个基础版的通讯录,能够实现简单的功能如下: 1. 添加联系人信息 2. 删除指定联系人信息 3. 查找指定联系人信息 4. 修改指定联系人信息 5. 显示所有联系人信息 6. 清空所有联系人 7. 以名字排序所有联系人现代码如下:#include "addlist.h"void Init原创 2018-01-12 17:01:26 · 266 阅读 · 0 评论 -
多种方法求平均数
求两个数的平均数最常用的方法就是(a+b)/2,不过这种方法很容易溢出,原因是由于整形数据存储中,以补码形式存储,整型的取值范围为:unsigned int :0~2^32-1signed int : -2^31~2^31-1所以当两个很大的数相加时就会溢出。提出第二种方法: printf("avg = %d\n", x+(y-x)/2);//分不同的部分怎么理解呢?其实很简单,比如原创 2017-12-13 18:34:03 · 1679 阅读 · 0 评论 -
c语言指针实现冒泡排序及其优化
冒泡排序是一个十分容易实现的算法,简单说明一下: 假设数组长度为 N,要求从小到大排序: 1从第一个数开始比较相邻两个元素,如果前面的数据大于后面的数据,就将二个数据交换。 2对数组元素进行一次第一次遍历后,最大的数据就’沉’到了数组最后一个位置。 3重复遍历过程,直到N-1次,此时排序完成。 用一张网上的图来大致说明一下: 给出实现的代码:void Bubble_Sort(int原创 2017-11-19 22:01:27 · 12127 阅读 · 0 评论 -
c语言数组遇上sizeof和strlen
数组的一些运算首先,先来看一个例子://一维数组 int a[] = {1,2,3,4}; printf("%d\n",sizeof(a));//16(表示数组大小) printf("%d\n",sizeof(a+0));//4(a[0]地址) printf("%d\n",sizeof(*a));//4(对地址解引用,表示首元素) printf("%d\n"原创 2017-11-26 11:39:57 · 273 阅读 · 0 评论 -
c语言 关于数组 我们需要注意什么
一维数组1创建与初始化int arr[10];注:下标引用操作符[ ]里要给一个常量,不能使用变量。int arr1[10]={1,2,3};int arr2[]={1,2,3,4};注:数组在创建时如果不指定数组大小,就得初始化。元素个数由初始化的内容确定。 2数组的使用 总结:数组是使用下标来访问的,下标是从0开始。 数组的大小可以通过计算得到。int arr[10]原创 2017-11-22 23:57:41 · 4278 阅读 · 0 评论 -
c语言小程序之三子棋
第一次写这么长的程序,再此总结一下。 首先考虑test.c的功能: 1)main函数内实现一个游戏界面,用一个循环可以让游戏一直循环进行,并且再循环内部使用分支用来选择开始游戏or退出游戏。 2)写一个menu函数,作用是打印游戏菜单界面。 3)写一个game函数,主要在函数内部调用各个步骤的函数,实现一个玩游戏的过程,并且输出谁赢谁输。 game.c内部主要实现各个test.c里各个函数原创 2017-11-21 21:27:56 · 266 阅读 · 1 评论 -
c语言:代码实现折半(二分)查找
折半查找 又称二分查找。 折半查找算法是在有序数组中用到的较为频繁的一种算法,如果要在一组有序数据中查询某个关键字,需要对数组进行遍历,跟每个元素进行比较,其时间为O(n). 显然折半查找算法则更好,因为其查找时间为O(lgn)。 举一个例子: 数组{1, 2, 3, 4, 5, 6, 7, 8, 9,10},查找元素7,用二分查找的算法执行的话,其顺序为: 1.第一步查找中间原创 2017-11-15 20:41:06 · 338 阅读 · 0 评论 -
c语言:操作符小结
操作符 分类: 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用、函数调用和结构成员1,算术操作符 + - * / % 1. 除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。 2. 对于/操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法原创 2017-11-15 09:53:06 · 183 阅读 · 0 评论 -
c语言:常量,变量及其存储方式小结
在c语言中,数据有两种表现形式,按其值可分为:变量+常量一:常量常量的分类:字面常量: 1 3.14 ‘w’ ‘\n’const定义的常量:在c语言中,const修饰一个标识符时,我们说这个标识符依然是一个变量,但是具有常属性,不能被直接改变。#include int main(){ int num=0; const int c_num=0;原创 2017-11-07 15:03:18 · 6547 阅读 · 0 评论 -
c语言:对转义字符的认识
转义字符先举 一个例子:如果我们想要在屏幕上打印这句话:(are you ok ??)结果显然是不正确的。为什么会这样呢?是由于三字母符的原因。三字母符:就是几个字符的序列,合起来可以表示另外一个字符。那如果我们要正常的想输出刚才那句话应该怎么做,这时候就需要引入转义字符了。转义字符:第一个例子:比如说我们原创 2017-11-04 13:07:06 · 2362 阅读 · 0 评论 -
c语言:switch需要注意的问题
switch(表达式) { case 常量表达式1: 语句1; break; case 常量表达式2: 语句2; break; …… case 常量表达式n: 语句n; break; default:原创 2017-11-02 18:35:16 · 5094 阅读 · 2 评论 -
c语言小程序之扫雷简单实现
首先,我们需要考虑这个游戏的实现要求: 1,玩家看到的游戏界面用*表示,我们在设计时可以看到两个界面,所以就需要两个数组。一个表示可视化游戏界面,一个表示雷阵界面。 2,玩家在第一次踩到雷,要求将雷移走,可以继续游戏。 3,遇到四周没有雷的地方,要求可以扩展,并显示周围雷的数量。 4,直到踩到雷,游戏结束。或者将所有没有雷的地方排开,游戏胜利。大体思路就是这样,下面来具体分析一下游戏设计过程原创 2017-11-28 15:22:32 · 974 阅读 · 0 评论 -
c语言模拟实现strcpy
首先先来分析库中的strcpy函数 我们可以看到,这个函数的功能是 将source中的字符拷贝到destination中去,直到遇到结束标志停下,并且将结束标志也拷贝进去。而且函数的返回值是destination,也是char类型。 实际上,这个函数是不安全的,在拷贝时,并不考虑目标的空间大小。下面我们来实践自己模拟的strcpy函数: 首先考虑函数的参数,由于传参传的是首元素地址,所以我们原创 2017-11-29 11:36:28 · 351 阅读 · 0 评论 -
浮点型数据在内存中的存储
常见的浮点数3.141591E10float、double、long double浮点数在计算机是如何表达的?规定1.任意一个二进制浮点数f都可以表达成下面的形式:(-1)^S*M*2^E(-1)^S表示符号位,当s=0时,f为正数;当s=1时,f为负数。M表示有效数字,大于等于,小于2.2^E表示指数位。举例说明: 十进制的5.0,二进制是101.0,相当于1.01*2^2. 按照以原创 2017-12-08 21:06:57 · 399 阅读 · 0 评论 -
c语言数组与指针,函数与指针
学过c语言的人都知道,指针是c语言中比较复杂难理解的一个知识点,想要理解透彻有些难度,所以在此辨析一些容易混淆的概念,整理了有关指针的知识点。1,什么是指针首先,先来看几个概念。指针:就是地址。指针变量存放地址的变量。变量指针:变量的地址。 所以,我们常常听到定义一个指针,实际上是定义一个指针变量,而不是定义一个指针,指针既然是地址,又怎么能被定义呢?只不过我们口语中习惯与说定义一个指针了而原创 2017-12-20 16:43:18 · 186 阅读 · 0 评论 -
c语言中关于宏
我们在写c语言程序中,已经初步了解到了#define的用法,下面对#define做一个详细的用法说明。#define格式如下:#define name stuff有了这条指令之后,每当有name出现,就会被预处理器替换为stuff。 例:#define reg register#define do_forever for(;;)#define CASE原创 2017-12-03 17:43:34 · 204 阅读 · 0 评论 -
大小端介绍
什么是大端小端?大端模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中; 小端模式:是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中;为什么有大端小端?在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8个bit位。但在c语言中,除了8个bit位的char类型之外,还有16个bit位的short类型,32个bit位的lon原创 2017-12-02 18:18:58 · 263 阅读 · 0 评论 -
谈谈c语言程序如何变成可执行文件
环境在ANSI的任何一种实现中,存在两种不同的环境。 翻译环境:在这个环境里,源代码被转换为可执行的机器指令。 执行环境:用于实际执行代码。翻译环境组成一个程序的每个源文件通过编译过程分别转成目标代码各个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行程序。链接器同时也会引入标准c函数库中的任何被改程序所用到的函数。 过程如下图所示 实际上,翻译环境本身也有几个阶段组成: 编原创 2017-12-02 17:48:50 · 12504 阅读 · 0 评论 -
可变参数列表解析
可变参数在写c程序时,我们经常使用到printf这个函数,那么在使用这个函数时,我们给他传参吗?传几个参数? 可以看一下函数原型: 可以看出,printf也是有参数的,并且可以传1个以上任意多个参数。 这就是可变参数。 举一个实例来说明:int average(int n, ...){ va_list arg;//定义一个指针变量 int i = 0; int原创 2017-12-10 17:50:28 · 156 阅读 · 0 评论 -
main函数参数解析
在函数调用过程中,我们发现函数是有参数的。 在研究栈帧时,我们知道main函数也是函数,他也有自己的栈帧,并且main函数是被mainCRTStartup函数调用的,那么在程序调用main函数时,需不需要向main函数中传参呢? 答案是要的,并且main函数中有3个参数:int main(int argc,char *argv[],char *envp[]){}第一个参数:argc是个整形参数原创 2017-12-10 17:22:11 · 381 阅读 · 0 评论 -
递归与迭代
递归递归是什么? 简单来说,就是函数自己调自己的一种方法。 通常可以把一个大型复杂的问题转化为一个与原问题相似的规模较小的问题来求解。 递归的两个必要条件:限制条件,必须存在一个递归出口,当满足这个条件时,递归便不再继续。每次递归之后都将问题规模缩小化,并且越来越接近这个限制条件。以下用几个实例来说明: 题目一:接受一个无符号整数,把它转化为字符并打印它。void Print(int原创 2017-12-10 15:40:54 · 485 阅读 · 1 评论