C
文章平均质量分 70
编程鸟
编程使我快乐,编程使我富裕,编程使我幸福!我爱编程!
展开
-
strcpy和memcpy的区别
1 strcpy函数1.1 函数原型char strcpy(char dest, const char src);1.2 函数功能strcpy是一种C语言的标准库函数,strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char。1.3 说明src和dest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的字符串,返回指向dest的指针。2 memcpy函数2.1 函数原型void *memcpy(void *str1, const void *st原创 2021-10-14 20:50:51 · 384 阅读 · 1 评论 -
C语言格式输出
格式说明由“%”和格式字符组成,如:%d%f等。它的作用是将输出的数据转换成指定的格式输出。格式说明总是由“%”字符开始的。格式字符有:d、o、x、u、c、s、f、e、g等。1、%d整形输出,%ld长整形输出。2、%o以八进制数形式输出整数。3、%x以十六进制形式输出整数,或输出字符串的地址。4、%u以十进制数输出unsigned型整数(无符号数)。注意:%d与%u有无符号数值范围。5、%c用来输出一个字符。6、%s用来输出一个字符串。7、%f用来输出实数,以小数形式输出,默认情况下保留小数原创 2021-07-12 16:08:09 · 2850 阅读 · 0 评论 -
C语言关于存储的基础知识
一、综述:用于存储程序数据的内存可用存储期、作用域和链接来表征。二、存储期:存储期可以是静态的、自动的、或者分配的。1)如果是静态的,内存在程序开始执行时被分配,并在程序运行时一直存在。2)如果是自动的,变量所用内存在程序执行到该变量定义所在代码块时开始分配,在退出代码块是释放。3)如果是分配的内存,内存通过调用malloc()或calloc()函数分配,通过调用函原创 2018-06-04 09:15:11 · 588 阅读 · 0 评论 -
C语言关键字解析
在C语言中有32个关键字,如下表所示: 释: (1)声明: 1)告诉编译器,这个名字已经匹配到一块内存上; 2)告诉编译器,这个名字已经预定了,其他地方再也不能用它来作为变量名或对象名。 (2)定义: 编译器创建一个对象,为这个对象分配一块内存空间,并给它取上名字,这个名字就是我们经常所说的变量名或者对象名。 (3)声明和定义的区别: 1)声明可以出现多次,但是定义只能一次。 ...原创 2018-09-09 01:34:52 · 37704 阅读 · 6 评论 -
宏与函数的比较
1、宏的概念 宏定义是指将一个标识符定义一个字符串,在源程序中该标识符被字符串替换的实现方式。宏书写的格式为:#define 宏名(参数表) 宏。2、宏与函数的区别 3、宏的优缺点 (1)优点: 1)提高程序的可读性,而且方便修改; 2)宏只是进行简单的字符串替换,没有参数的入栈和出栈,提高了程序的运行效率。 (2)缺点: 1)宏不进行类型检测,存在安全隐患; 2)因为边界...原创 2018-09-10 12:47:12 · 2792 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如:输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。1、分析:(1)数组是已序的先找到中位数,统计它在数组中出现的次数,如果次数的2倍超过数组长度,那么就找到了;否则没有。(2)数组是待排序的先遍历整个数组,保存数组元素和统计元...原创 2019-04-20 23:17:20 · 233 阅读 · 0 评论 -
数组中的重复数
题目一:找出数组中重复的数字 在一个长度为n的数组里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但是不知道有几个数字重复,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。分析:方案1:先排序,再查找。先将数组排序,然后比较相邻元素,如果相等就找到重复数,...原创 2019-04-25 22:26:53 · 10434 阅读 · 0 评论 -
递归算法
1、递归的概念递归是一个函数在内部自己调用这个函数自身。【例1】求1+2+……+n的和//求1+2+···+n的和#include<stdio.h>#include<stdlib.h>//方法一:用递归算法实现int AddN(int n){return (n <=0) ? 0 : n + AddN(n - 1);}//方法二:用循环实现int...原创 2019-04-14 17:14:19 · 421 阅读 · 0 评论 -
替换空格
题目:实现一个函数,把字符串中的每个空格替换成“%20”。例如:输入“We are happy.”,则输出“We%20are%20happy.”。方案1:时间复杂度为O(n^2)的解法 从头到尾扫描字符串,每次遇到空格就进行替换。由于是1个字符替换成3个字符,所以需要空格后的字符向后移动2格,否则就有2个字符被覆盖。假设字符串的长度是n,对每个空格字符需要移动后面的O(n...原创 2019-05-01 22:26:30 · 227 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中的数字顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。方案1: 先从前往后遍历整个数组,当遇到偶数时保存该偶数,并将该偶数后面的元素向前移动一位,再将该偶数放到数组的末尾。由于每次遇到偶数就要移动O(n)个元素,因此总的时间复杂度是O(n^2)。方案2: 先定义两个指针,一个指向数组首...原创 2019-05-02 12:55:26 · 200 阅读 · 0 评论 -
在二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。分析:当在数组中选出的数字与要查找的数字相等时,就结束查找; 当在数组中选出的数字比要查找的数字大,则要查找的数字在选出数字的左边或者在上边; 当在数组中选出的数字比要查找的数字小,则要查找的数字在选出数字的右...原创 2019-04-27 23:27:40 · 254 阅读 · 0 评论 -
数组中唯一出现一次的数字
题目:在一个数组中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。解题思路:如果一个数字出现三次,那么这个数表示的二进制的每一位的和都能被3整除。把不能整除的数加起来就是那个只出现一次的数字。如:在数组{8,6,7,8,8,6,6}中,3个8的二进制的每一位的和为:1000+ 1000+ 1000 = 3000,3个6的二进制的每一位的和为:0110 + 0...原创 2019-05-20 23:52:38 · 853 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,4,5,6}和数字6,由于3在数组中出现了3次,因此输出3方案一:时间复杂度为O(n)先用二分查找找到3; 在3的两边顺序扫描,分别找出第一个3和最后一个3的位置; 最后用最后一个3的位置减去第一个3的位置加1,就能得出3在数组中的个数。方案二:时间复杂度为O(log2(n))先用二分查找的方...原创 2019-05-11 19:09:06 · 274 阅读 · 0 评论 -
在0~n-1中缺失的数字
题目:0~n-1中缺失的数字 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。方案一:时间复杂度为O(n)先用公式n(n-1)/2求出数组0~n-1的和,记为s1; 再求出数组元素的和,记为s2; 用s1减去s2就可以求得缺失的数字。方案二:时间复杂度为...原创 2019-05-12 12:04:47 · 695 阅读 · 0 评论 -
数组中数值与下标相等的元素
题目:数组中数值和下标相等的元素。 假设一个单调递增的数组里的每一个元素都是整数并且是唯一的。请编程一个函数,找出数组中任意一个数值等于其下标的元素。例如,在数组{-3,-1,1,3,5}中,数字3和它的下标相等。方案一:时间复杂度为O(n)遍历整个数组的元素,并且逐一检验元素是不是与下标相等。方案二:时间复杂度为log2(n)因为是在一个单调递增的数组里,所以可以考...原创 2019-05-12 18:19:24 · 960 阅读 · 0 评论 -
找出数组中只出现一次的数字
题目:一个整形数组里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。1、解题思路在这个数组里只有两个数出现一次,而其它数字都出现了两次。因为一个数字异或它本身等于0,所以可以消除出现两次的数字。剩下两个出现一次的数字可以把它们分到两个子数组中,这样问题就解决了。2、解题步骤:(1)分别异或整个数组中的元素,可...原创 2019-05-18 18:38:26 · 2244 阅读 · 0 评论 -
编译和链接
一、环境 1、翻译环境,在这环境中源代码被转换成机器可识别的代码; 2、运行环境,代码实际被执行的地方。二、预编译 1、含义:将源代码文件test.c和相关的头文件,如stdio.h等被预编译器预编程成一个.i文件。 2、规则: 1)将所有的“#define”删除,并且展开所有的宏定义。 2)删除所有的注释“//”和“/* */”. 3)原创 2018-06-04 09:13:53 · 428 阅读 · 0 评论 -
求二进制中1的个数
题目:请事先一个函数,输入一个整数,输出该数二进制中表示1的个数。例如,把9表示成二进制1001,有2位是1。因此,如果输入9,则该函数输出2。1、位运算知识补充 位运算共有5种运算:与、或、异或、左移和右移。 (1)与、或和异或的运算规律 (2)左移 m<例:0000 1010B = 10d;1000 1010B = -10d 1)(无符号)0000 1010 << 2 = 0原创 2018-04-28 21:42:44 · 8849 阅读 · 0 评论 -
链表的基本操作
1、类型重定义typedef int DataType; 2、结构体定义 typedef struct Node { DataType _data; struct Node* _next; }Node,*pNode, *pList; 3、初始化链表void InitLinkList(pList *pplist){ a原创 2017-07-03 18:16:14 · 3221 阅读 · 0 评论 -
浅谈程序数据在执行时的变化
一、综述:用于存储程序数据的内存可用存储期、作用域和链接来表征。二、存储期:存储期可以是静态的、自动的、或者分配的。1)如果是静态的,内存在程序开始执行时被分配,并在程序运行时一直存在。2)如果是自动的,变量所用内存在程序执行到该变量定义所在代码块时开始分配,在退出代码块是释放。3)如果是分配的内存,内存通过调用malloc()或calloc()函数分配,通过调用函原创 2017-05-30 11:23:23 · 3735 阅读 · 0 评论 -
模拟实现库函数
这篇博客模拟实现了strcpy、strcat、strcmp、strlen、strstr、memcpy、memmove等函数。原创 2017-05-30 10:24:04 · 3903 阅读 · 0 评论 -
对象所占的内存大小
1、计算各种类型的大小# include <stdio.h># include <stdlib.h>int main(){printf("char类型的大小是: %d\n", sizeof(char));printf("short类型的大小是: %d\n", sizeof(short));printf("int类型的大小是:...原创 2017-05-21 19:09:00 · 3775 阅读 · 0 评论 -
数组的知识点汇总
一、数组的含义 数组是一组相同类型元素的集合。二、数组的创建方式 类型 + 数组名【常量】。例如:int arr[10];但是,如果是: const int count = 10; int arr[count]; 就不行了。因为,数组创建下标引用操作符【】中要给一个常量才行,不能使用变量,即使是常变量也不行。三、数组的初始化 数组的初始化原创 2017-05-21 19:05:24 · 4713 阅读 · 0 评论 -
函数的调用过程
1、什么是栈帧?栈帧也叫过程活动记录,是编译器用来实现函数调用过程的一种数据结构。C语言中,每个栈帧对应着一个未运行完的函数。从逻辑上讲,栈帧就是一个函数执行的环境:函数调用框架、函数参数、函数的局部变量、函数执行完后返回到哪里等等。栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器es转载 2017-07-18 16:35:56 · 3871 阅读 · 0 评论 -
测试机器大小端存储的方法
小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加原创 2017-07-18 16:05:37 · 3963 阅读 · 0 评论 -
对指针的认识
1、指针数组 它是一个数组,数组的元素都是指针,数组占多少字节由数组本身决定,简称为:存储指针的数组。 【例】int *P1[10]; 分析:“[]”的优先级比“*”要高,P1先与“[]”结合,构成一个数组的名义,数组名为P1;int * 修饰的是数组的内容,即数组的每个元素。这样可得知:这是一个数组,这个数组有十个元素,每个元素为int类型的指针,如图1所示。2原创 2017-05-30 10:56:38 · 3639 阅读 · 0 评论 -
内存分配函数
1、函数简介: 1)malloc函数,其原型如下: void *malloc(size_t size); malloc所分配的是一块连续的内存,其参数就是需要分配的内存字节数。如果分配成功,则返回指向这块内存的指针;如果分配失败,则返回NULL指针。2)calloc函数,其原型如下: void *calloc(size_t num_elements, size_t size原创 2017-07-20 08:19:24 · 4863 阅读 · 0 评论 -
链表的面试题
1、比较顺序表和链表的优缺点,它们分别在什么场景下使用? 1)顺序表支持随机访问,单链表不支持随机访问。 2)顺序表插入/删除数据效率很低,时间复杂度为O(N)(除尾插和尾删),单链表插入/删除效率更高,时间复杂度为O(1)。 3)顺序表的CPU高速缓冲效率更高,单链表CPU高速缓冲效率低。2、打印单向链表 void Display(pList plist) { pNode c原创 2017-07-05 02:23:13 · 3280 阅读 · 0 评论 -
希尔排序
(1)概念: 希尔排序(Shell Sort),也称为递减增量排序算法,是插入排序的一种高速而稳定的改进版本。希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1)插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率; 2)插入排序是低效的, 因为插入排序每次只能将数据移动一位。(2)性能分析: 平均时间复杂度:O(nlogn) 稳定性:不稳定(3)基本思想:原创 2017-09-14 11:23:58 · 2232 阅读 · 0 评论 -
直接选择排序
选择排序算法就是每一趟从待排序的记录中选出关键字最小(最大)的记录,顺序放在已排好序的子文件的最后(最前),直到全部记录排序完毕。常见的选择排序有直接选择排序(Selection Sort),堆排序(Heap Sort),平滑排序(Smooth Sort),笛卡尔树排序(Cartesian Sort),锦标赛排序(Tournament Sort),循环排序(Cycle)。1、直接选择排序 直...原创 2017-09-16 10:41:13 · 3077 阅读 · 1 评论 -
C文件接口
一、打开流1、概念:fopen函数打开一个特定的文件,并把一个流和这个文件相关联。 2、函数原型:FILE *fopen(char const *name, char const *mode);释:1)name表要打开的文件或设备的名称。2)mode表流是用于只读、只写还是既读又写,以及它是文本流还是二进制流。常用模式如下表所示: 读取写入添加文本“r”“w”“a”二进制“rb”“wb”“ab”注原创 2018-01-19 17:10:24 · 1842 阅读 · 0 评论 -
C语言基础测试题1
1、下面的代码输出是多少?为什么?#include<stdio.h>#include<stdlib.h>void foo(void){ unsigned int a = 6; int b = -20; (a + b > 6) ? puts(">6") : puts("<6");}int main(){ foo(); printf("\n");原创 2018-04-22 10:44:59 · 9891 阅读 · 0 评论 -
C语言基础测试题2
1、请写出bool、float、指针变量与“零值”比较的if语句。 (1)请写出bool flag与“零值”比较的if语句:答:if(flag)或if(!flag);(2)请写出float x与“零值”比较的if语句: 答:#define EXP 0.000001if((x>-EXP) && (x<EXP))(3)请写出char *p与“零值”比较的if语句:答:if(p == NULL) 或原创 2018-04-23 21:24:21 · 3183 阅读 · 0 评论 -
复杂链表的复制
什么是复杂链表? 复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用于存放数据,还有两个指针域,其中一个指向下一个节点,还有一个随机指向当前复杂链表中的任意一个节点或者是一个空结点。要实现复制一个复杂链表,首先要知道复杂链表的结构。 复杂链表的数据结构定义如下: typedef int DataType; //数据域的类型 //复杂链表的数据结构 typedef struct Co原创 2017-07-05 15:05:32 · 3289 阅读 · 0 评论