C
文章平均质量分 54
宇哲_安菲尔德
这个作者很懒,什么都没留下…
展开
-
C语言一些关于位操作符的小练习
1.编程实现: 两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同? 输入例子: 1999 2299 输出例子:7#include<stdio.h>#include<stdlib.h>int Different_bits(const int num1, const int num2){ int a = num1; int b = num2;原创 2016-04-04 14:31:27 · 905 阅读 · 0 评论 -
双向链表的实现
双向链表,双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。 代码如下://double_link_list.h头文件#ifndef __DOUBLE_LINK_LIST_H__#define __DOUBLE_LINK_LIST_H__#i原创 2016-04-20 18:15:04 · 823 阅读 · 0 评论 -
有趣的通讯录—动态版
我们完成我们的第二个版本的通讯录,动态版的,在这里和第一次一样,我任然使用三个文件contact_text_2.h封装结构体以及函数声明,contact_text_2.c封装函数算法,最后,test.c封装主函数和测试函数。contact_text_2.h#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#i原创 2016-05-15 16:15:11 · 845 阅读 · 0 评论 -
C和指针—结构体和联合
首先在这一章我们要讲的是结构与联合。 在平时,我们往往需要对数据进行成组的形式进行存储和访问,所以,在这里C提供了两种可以存储多种数据的数据类型:数组和结构。1.关于结构体的基础知识数组,这是一个同类型元素的集合,而结构体,可以存储不同类型的元素,并且这两个类型的访问方式也是不一样的,数组是通过下标的形式进行访问的,而结构体是通过名字来访问。所以,一个结构变量在表达式中使用时,他并不被替换成一个指原创 2016-05-14 17:28:08 · 3118 阅读 · 0 评论 -
有趣的通讯录—<静态版>
在这里我们要解决的问题是采用顺序表的形式制作一个通讯录。对于顺序表就是一种静态的模式,后续会有动态模式,以及文件操作模式,敬请期待!!!后续我会更新其他方式的操作。 在这里,我们需要三个文件,contact.h封装结构体以及函数声明,conteact.c封装函数算法,最后,test.c封装主函数和测试函数。contact.h#include<stdio.h>#include<stdlib.h>原创 2016-05-14 09:45:41 · 987 阅读 · 1 评论 -
关于C函数的调用过程-栈帧
关于栈帧,从逻辑上讲,栈帧就是一个函数执行的环境:函数参数、函数的局部变量、函数执行完后返回到哪里等等。 首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),我们称为栈底指针,寄存器esp指向当前的栈帧的顶部(低地址),我们称为栈顶指针。 注意:EBP指向当前位于系统栈最上边一个栈帧原创 2016-04-15 20:52:45 · 2218 阅读 · 0 评论 -
可变参数列表
在函数原型中,列出了函数期望接受的参数,但原型只能显示固定数目的参数。让一个函数在不同的时候接受不同数目的参数是不是可以呢?答案是肯定的,但存在一些限制。#include<stdio.h>#include<stdlib.h>#include<stdarg.h>//利用可变参数列表实现加法。int add(int num, ...){ int i = 0; int sum =原创 2016-04-13 00:21:50 · 1173 阅读 · 0 评论 -
判断字符串包含的问题
在判断字符串包含的问题时,我们会有一种思路,就是原字符串与子字符串进行比较,然后把子字符串中的每一个元素和原字符串进行依次的比较,这样下去,最终得到结果。这样最终虽然能够得到结果,但是效率太低了,所以这里需要一种新的思路。 在这,我们提供一种新的思路: 如下题://判断一个字符串是否为另外一个字符串旋转之后的字符串。//例如:给定s1 = AABCD和s2 = BCDAA,返回1,给定s1 =原创 2016-04-16 16:34:54 · 478 阅读 · 0 评论 -
单循环链表的实现
对于单循环链表: 它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。//circular_linked_list .h 头文件#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>typedef struct round{ int data; struct round *pN原创 2016-04-17 16:57:35 · 1260 阅读 · 0 评论 -
C语言之内存字节对齐
我们常常回来讨论结构体的内存大小 比如下面这段代码:#include<stdio.h>#include<stdlib.h>struct arr{ int a; int b;};int main(){ printf("%d", sizeof(struct arr)); system("pause"); return 0;}我们可以知道这最终输出为8原创 2016-04-30 18:28:58 · 780 阅读 · 0 评论 -
让人分不清的sizeof和strlen
接下来我们来说说sizeof和strlen。1.sizeof函数or关键字?对于sizeof,第一点我们要清楚的是,它是一个关键字,并不是一个函数。正因为sizeof不是函数,因此我们不把它所要求得长度的对象叫做参数,这也是sizeof不能求得void类型的长度 你无法求出sizeof(void),其实你是无法声明出void的一个变量的,void指的是一个空类型,空类型你是无法知道变量内存空间原创 2016-04-04 15:52:39 · 519 阅读 · 0 评论 -
常用的内存操作函数
接下来我们进行详细剖析一些内存操作的函数:1.malloc()函数,calloc()函数和free()函数malloc()函数和free()函数malloc()函数原型:void *malloc(size_t size);malloc()函数用来内存分配,如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当然,对于malloc()函数所对应的就是free原创 2016-04-30 12:06:13 · 2751 阅读 · 0 评论 -
有趣的通讯录—最终版
我们完成我们的第二个版本的通讯录,文件版的,在这里和第一次一样,我任然使用三个文件contact_text_3.h封装结构体以及函数声明,contact_text_3.c封装函数算法,最后,test.c封装主函数和测试函数。这里我们需要熟悉文件操作,对于fopen函数的使用,文件指针的使用,还有fread函数和fwrite函数。这些最后可以使得我们将通讯录中的内容保存下来,然后方便了下一次的读取,如原创 2016-05-17 22:42:48 · 4656 阅读 · 0 评论 -
字符串函数的实现
1.strcat函数的实现原型声明:char strcpy(char dest, const char *src); 头文件:#include #include<stdlib.h>#include<assert.h>#include<stdio.h>char *my_strcpy(char *dest, const char *src){ char *ret = dest;原创 2016-04-09 19:21:43 · 645 阅读 · 0 评论 -
C语言小项目—注释转换
本次这个小项目的目的是把.c文件中的C风格的注释转换成为C++风格的注释。C注释风格:/**/ C++注释风格://首先我们分析一下会出现的几种状态,以及各种状态之间的转换关系: 首先我们在这里对一些状态进行了标注,我们这里已知的有4种状态, 第一种是END_STATE 第二种是C_STATE 第三种是CPP_STATE 第四种是我们平时的NULL_state。在这里,注释转换操作的是文原创 2016-05-22 17:16:48 · 3745 阅读 · 0 评论 -
C语言知识点总结
在这里对C语言利用思维导图的方式进行总结一下,写的不算太深,主要是能让大家知道复习时应该搞清楚的问题。思维导图后续仍然会补充,如果需要思维导图文件,请发邮件到[email protected]原创 2016-05-22 14:17:44 · 8615 阅读 · 5 评论 -
剑指offer—旋转字符串
2.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA#define _CRT_SECURE_NO_WARNINGS 1//2.实现一个函数,可以左旋字符串中的k个字符。//AABCD左旋一个字符得到ABCDA//AABCD左旋两个字符得到BCDAA#include<string.h>#include<stdio.h>原创 2016-04-16 15:59:53 · 459 阅读 · 0 评论 -
C语言编程之计算二进制数中1的个数
首先我们利用第一种方法,在这我们可以知道,我们从二进制最小位依次往上看。 例如:5的二进制是101,如果它的二进制最小位上是有数值得,这样我们就对他++,否则,我们就进行移位操作,这部操作当然也可以用除二来代替。 代码如下://写一个函数返回参数的二进制中1的个数#include<stdio.h>#include<stdlib.h>int count_one_bits(unsigned i原创 2016-03-15 22:30:46 · 11641 阅读 · 1 评论 -
长度受限的字符串函数的实现
1.strncat()函数 首先要说的是strncat函数 函数原型: char *strncat(char *dest,const char *src,size_t len); strncat就是把src中的最多len个字符复制到目标数组的后面,但是,strncat总是在结果的字符加一个NUL字节。//实现strncat函数#include<stdio.h>#include<stdli原创 2016-04-23 21:46:45 · 963 阅读 · 1 评论 -
链式栈的实现
链式栈: 链式栈的结构与链表类似,如所示,其中,top为栈顶指针,始终指向栈顶元素,栈顶元素的指针指向下一个元素,依此类推,直到栈底,栈底元素的指针区域为空如果top为空,表示该栈是个空栈。我使用了三个文件实现了链式栈,首先是linked_stack.h,包含了我的结构体和函数声明#ifndef __LINKED_STACK_H__#define __LINKED_STACK_H__#defin原创 2016-04-23 18:54:38 · 649 阅读 · 0 评论 -
顺序栈的实现
顺序栈 利用一组连续的内存单元依次存放自栈底到栈顶的数据,同时,用一个指针top只是栈顶的位置,在C语言中,这可用数组来实现,一般是先开辟一块区域,在编程中可根据需要再对此区域进行调整。在这里,我依然使用三个文件来实现顺序栈。 首先,是我的Sequence_stack.h头文件,里面封装了我的顺序栈还有我的函数声明#define _CRT_SECURE_NO_WARNINGS 1#ifndef原创 2016-04-23 17:09:49 · 921 阅读 · 0 评论 -
关于C语言中的文件操作
大一开了C语言课时,一直到最后我都是没有接触过文件操作的,那时马上要结课了,老师讲的也特别快,所以了解程度也不是太高,所以也觉得需要进行一下总结:闲话也就不多说了,进入正题, 对于文件,我想概念不需要我们来多说了,在这里我们叙述一下C语言中对文件操作的流程: 首先,我们要打开文件,然后要读写文件,然后我们要关闭文件。1.文件操作相关基础关于流: 流是一个抽象出来的东西,流指的是一种信息转换,就原创 2016-05-18 20:51:52 · 4095 阅读 · 0 评论 -
C中重要的几个关键字
今天我们来说一下C语言中的几个关键字,这都是前几天偷懒的下场,本来应该早早就写了这一篇的。1.static关键字首先,对于这个关键字,我们很熟悉,接下来我们来说一下它的作用: 当static用于函数定义时,或者用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,会将这个函数或者这个变量变为内部链接,只能当前的他们所在的源文件对这个函数或者变量进行访问。当它用于代码块内部的变量声原创 2016-05-07 20:25:35 · 905 阅读 · 0 评论 -
字符串处理函数(续)
今天我们来说一下一些字符串处理函数今天所探讨的函数是除了我前面两篇博客之外的字符串函数 前两篇博客如下:字符串函数的实现 长度受限的字符串函数的实现另外,还有这一篇中所写的常用的内存操作函数1.查找一个字符关于查找一个字符,我们这里有两种清况,查找一个字符第一次出现的情况,还有一个是查找字符最后一次出现的情况。strchr()函数函数原型:char *strchr(char const *s原创 2016-05-07 10:18:20 · 595 阅读 · 0 评论 -
剑指offer刷题—二维数组的查找
最近接触到一本书叫做剑指offer,在这里准备在这个2个月左右将这本书刷完,当然,不需要每天多少道什么的,不在多,一天理解一道就好了,希望能成为一种习惯,另外,准备在github上也进行同步分享。今天第一道题: 面试题3:二位数组中的查找 当我们需要解决一个复杂问题时,一个很有效的方法就是从具体的问题出手,通过分析具体的例子,得到规律。 再一个二维数组中,每一行都要按照从左到右递增的顺序排序,原创 2016-05-06 22:54:52 · 1924 阅读 · 0 评论 -
浮点数的问题
float %f 4个字节 double %lf 8个字节 long double %Lf 8个字节(某些平台下为16个字节)浮点数会有一定的误差,智能精确到具体位之内。三种类型的范围#include<stdio.h>#include<stdlib.h>#include<float.h>int main(){ //输出三种浮点数的范围。 pri原创 2016-04-16 17:29:01 · 625 阅读 · 0 评论 -
浅析进程地址空间
在linux下,当我们对我们所写好的程序.c文件进行gcc编译过程时,会出现一个a.out可执行文件,这个文件中到底包含什么呢,接下来我们来看一看。 在UNIX下可使用size命令查看可执行文件的段大小信息。如size a.out。 接下来,我进行测试的演示: 这个是我写好的测试程序。 首先我们来测试这个程序的段大小信息。 我们在这,可以知道,a.out中含有 text(文本段),原创 2016-04-15 20:27:52 · 443 阅读 · 0 评论 -
C语言小编程之不创建临时变量,交换两个数的值
在这里我们既然不需要使用中间变量,那么我们就要对这里面进行一系列的思考,我们可以通过两个数的和和差进行判断。 例:比如我们给出两个数,num1=8和num2=7,首先对num1赋值num1=num1-num2,然后num2=num1-num2. 最后得出num1=num1-num2 代码如下://不创建临时变量,交换两个数的值#include<stdio.h>#include<stdlib原创 2016-03-14 22:58:43 · 1370 阅读 · 0 评论 -
C语言小编程之素数算法剖析
首先,我们在这里的问题是确定100-200之间的素数。 关于素数的分析: 首先我们先要明确一个概念,什么是素数,素数就是只能被1和它本身整除的数,在这,我们先要进行的就是提取出100-200的数,然后对这些数进行判断,如果是只有1和它本身可以整除,那么就输出,否则不输出。 代码如下:#include<stdio.h>#include<stdlib.h>int main(){ in原创 2016-03-13 22:13:26 · 1333 阅读 · 0 评论 -
C语言小编程之九九乘法表
在初学C语言中,我们会遇到很多九九乘法表的问题,在这我们进行一系列的分析。 九九乘法表的格式是x*x=x的格式。 接下来,我们要做的是利用循环结构,使得数量发生变化。在最后,要对乘法表的形状进行限定。 首先我们先进行,对 两个乘数进行循环。然后求积,最后输出,我们要打印传统的乘法表,那么我们就要对每一行进行切行,并且对所循环的进行限定。 代码如下://九九乘法表;#include<stdi原创 2016-03-13 20:40:57 · 77506 阅读 · 10 评论 -
C语言小编程之闰年判断
关于闰年的判断问题,首先我们要明确,什么称为闰年, 闰年的判断条件为: 1.能够被4整除却不能被100整除的数。 2能够被400整除的数。 所以我们可以将这两个条件作为if条件;然后轻易地判断出一个年份是不是闰年。 代码如下://3.判断1000年到2000年之间的闰年;#include<stdio.h>#include<stdlib.h>#include<assert.h>int原创 2016-03-13 19:38:43 · 16815 阅读 · 2 评论 -
3月6日C Primer Plus 读书笔记(第十章:指针)
向函数传递数组信息的方法:第一种是使用一个指针参量来确定数组的开始点,使用一个整数参量来指明数组的元素个数。第二种是传递两个指针,第一个指针指明数组的起始地址,第二个指针指明数组的结束位置。指向数组之后的第一个位置的指针也是有效的。但是如果超出了这个范围,后果是未知的。一元运算符*和++具有相等的优先级,但它在结合时时从右向左进行的。例:total+=*star原创 2016-03-07 12:56:01 · 697 阅读 · 0 评论 -
关于C语言中进制问题以及简单的浅谈进制转化问题。
对于一般学习中,最常见的就是4种,二进制,八进制,十进制以及十六进制。在大一的C语言学习当中,学校粗略的说了一下这些,最后导致好多人无法流畅的进行进制之间的转化,以及使用。在大一接触单片机以后更加发进制之间转化的一些规律等,现在来谈一下。1.关于十进制与二进制之间的转化。在这四种进制当中,最常用的就是十进制了,从我们开始学数学开始,一直用的就是十进制。二进制,就是0和1,这是机器能够读懂的原创 2016-02-05 10:52:45 · 3294 阅读 · 1 评论 -
C语言之谈谈存储类、链接。
C语言学习的一大难区就是内存管理,存储类,链接,我认识是对内存管理操作之前所必须要掌握的。 在我们大一学习C语言的时候,曾经碰见过一些关键字:static,extern,以及在单片机编程时遇到的register。 其实当我们对存储类,链接有了了解之后, 这些疑惑都会解决。 1.存储类 首先我们讨论存储类,存储类: 变量与函数的可访问性(即作用域范围scope)与生存期(life time)。原创 2016-03-16 20:30:21 · 1344 阅读 · 0 评论 -
C语言之清空缓存区
在C语言中,我们常常需要去清空缓存区,对于缓存区清空的重要性,接下来我们进行具体的说明。 首先我们先解释一下缓存区。1.缓存区C语言中的缓冲区又称为缓存,它是内存空间的一部分。 也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。 C语缓冲区分为三种类型:1、全缓冲 2、行缓冲 3、不带缓冲。 缓冲区根据其对应的是输原创 2016-03-19 22:33:11 · 89610 阅读 · 21 评论 -
C语言之两矩阵乘法的实现
首先我们要清楚矩阵乘法实现需要满足的条件, 矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义[1] 。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。//关于任意两个矩阵的乘法运算//关于任意两个矩阵的乘法运算#include<stdio.h>#include<stdlib.原创 2016-03-26 20:56:46 · 19495 阅读 · 4 评论 -
c语言小程序之三子棋小游戏的实现
在这里我们要写出一个三子棋的小游戏,能够实现所需要的三字连珠的功能,并且可以使得游戏让玩家进行选择是否继续的功能。#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<time.h>#define ROW 3#define COL 3void init_board(char arr[ROW]原创 2016-03-30 18:06:05 · 6702 阅读 · 2 评论 -
C语言之动态分配内存
首先,我们应该知道,所有的程序都必须留出足够的内存空间来存储所使用的数据,所以我们经常会预先给程序开辟好内存空间,然后进行操作,但其实还有一种选择,能够让内存分配自动进行下去。对于传统数组,会遇到这样的问题:int arr[5] ;对这个数组我们在定义的时候必须给提前开辟好空间,并且在程序执行的过程中,这个开辟的内存空间是一直存在的,除非等到这个函数执行完毕,才会将空间释放。还有一个问题就是这个数组原创 2016-03-16 12:26:09 · 11198 阅读 · 2 评论 -
C语言小编程之判断一个数是否是2的n次方的巧妙方法
今天我来分享一个判断一个数是否是二的倍数的巧妙方法: 代码如下:#include<stdio.h>int main(){ int num; scanf("%d", &num); while (num) { if (((num) & (num - 1)) == 0) printf("%d", num); bre原创 2016-03-17 22:30:57 · 9640 阅读 · 3 评论 -
递归函数
对于递归,递归函数直接或者间接地调用自身,函数每一次调用必须进一步的靠近目标,当达到目标时,递归函数就不再调用自身了。阅读递归函数,只要简单的认为递归函数将会执行它的预定任务即可。 尾递归:如果递归调用是函数所执行的最后一项任务,我们把它叫做尾递归。 对于尾递归,我们可以很方便地转换成一个简单循环,完成相同的任务,这就是我们所说的迭代。 如:阶乘和斐波那契数列的问题,用迭代来解决问题,效率就会原创 2016-04-16 17:57:57 · 483 阅读 · 0 评论