C语言
文章平均质量分 53
Hansionz
但愿一切
展开
-
指针和数组经典面试题目
前言:本篇文章主要针对前边写的一篇博客深度理解指针。本篇文章是基于前边所学到的知识的一些练习题目。利用数组和指针的相关知识,解决下边的问题。题目一:下面代码输出结果是什么 #include<stdio.h> int main() { int a[5] = { 1, 2, 3, 4, 5 }; int *p = (in...原创 2018-08-16 22:05:00 · 2502 阅读 · 1 评论 -
【剑指offer】:杨氏矩阵中查找一个数,时间复杂度小于O(N)(面试题三)
【问题描述】:杨氏矩阵有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的.在这样的数组中查找一个数字是否存在。如果存在返回坐标,不过不存在,返回不存在.时间复杂度小于O(N);例如数组:1 2 34 5 67 8 9【解决思路】:简单的办法是将二维数组遍历一遍,依次比较,但是这样的话时间复杂度肯定大于o(n),不符合题目要求。我们要想做到时间复杂度小于o(n),...原创 2018-05-24 19:47:41 · 1133 阅读 · 0 评论 -
结构体实现简单的静态通讯录(1)
前言:本篇文章主要介绍了基于结构体实现的一个简单通讯录,这个通讯录可以包含1000个人的容量,包含了增加联系人信息、删除指定联系人信息、查找联系人信息、修改指定联系人信息、显示所有联系人信息、清空所有联系人、以及按名字排序所有联系人。通讯录功能:* 1.增加联系人信息* 2.删除指定联系人信息* 3.查找联系人信息* 4.修改指定联系人信息* 5.显示所有联系人信息* 6.清空所有联系人* 7.按...原创 2018-05-30 23:14:48 · 295 阅读 · 0 评论 -
动态通讯录(2)的实现
前言:本篇文章利用结构体和动态内存开辟实现一个动态的通讯录,前面写过静态通讯录的实现,利用结构体的知识将所有人的信息存放在一个数组中,但是那样太浪费空间了,如果没有存放1000个人的信息,剩下的空间就浪费了,但是我们可以不用指定存放信息的数组大小,利用动态内存的开辟,用多大开辟多大,不够的话在重新开辟功能:...原创 2018-05-31 15:15:18 · 202 阅读 · 0 评论 -
通讯录(3)
前言:前面写了两个通讯录,一个是静态的通讯录原创 2018-06-01 12:40:15 · 449 阅读 · 0 评论 -
IO函数实现一个拷贝文件的命令
前言:本篇博客是利用main函数的参数实现一个拷贝文件的命令,要求熟悉使用各个IO函数。【参考代码】:#include<stdio.h>#include<stdlib.h>#pragma warning(disable:4996)int main(int argc,char *argv[],char *envp[]){ int ch = 0; FILE *pfr...原创 2018-06-01 13:25:22 · 1400 阅读 · 0 评论 -
rand函数生成随机数
C语言中,rand函数是用来产生随机数,但是并不是真真意义上的随机数,是一个伪随机数,是根据一个种子数产生的,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的函数原形是void srand( ...原创 2018-06-02 10:28:51 · 17353 阅读 · 0 评论 -
编程实现对一个8bit数据的指定为的置零或置一操作
题目描述: 编码实现以下功能的函数 功能:实现对一个8bit的数据(unsigned char类型)的指定位(例如第n位)的置零或者置1操作,并保持其他位不变。函数原型void bit_set(unsigned char *p_data, unsigned char position, int flag) 参数说明:p_data是指定源数据,position是指定位...原创 2018-06-25 10:05:54 · 510 阅读 · 0 评论 -
《剑指offer》:编程实现字符串到整数的装换,模拟实现函数atoi
题目描述 编程实现字符串到整数的转换,例如输入字符串“123456”,输出整数12345函数atoi atoi 是把字符串转换成整型数的一个函数。包含在头文件stdlib.h中。 函数原型: int atoi(const char *nptr); 参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包...原创 2018-06-25 11:27:01 · 314 阅读 · 0 评论 -
将数组中的奇数放在数组的前半部分,偶数放在数组的后半部分
【问题描述】:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分, 所有的偶数位于位于数组的后半部分。【解决方法】:首先我们将这个问题简化,不考虑相对位置,只要达到交换奇数和偶数的位置就好了。那么我们该怎么做呢?我们可以用两个指针标记开始和结尾,用左指针从数组的左边找找到偶数停下来,然后用右指针指针从数组的右边找,找到奇数就停下来,这时候两个指针分别指向数组前...原创 2018-05-24 19:09:13 · 2799 阅读 · 0 评论 -
c语言模拟实现库函数memmove
【函数作用】:memmove函数用于从sour(源内存)拷贝count个字节到dest(目标内存),如果目标内存和源内存有重叠的话,memmove函数能够保证源内存在被覆盖之前将重叠区域的字节拷贝到目标区域中。如果没有重叠,它和memcpy函数效果一样,但是效率没有memcpy函数高。为了可以拷贝各种类型的的数据,所以将形参和返回类型定义为void*(无类型),在函数内部强制类型装换为(char ...原创 2018-05-15 22:03:37 · 238 阅读 · 0 评论 -
模拟实现库函数strcat
【函数作用】:strcat的作用是连接两个字符串,l例如chars1[]="hello",chars2[]="world",strcat(s1,s2)的结果就是"helloworld",中间没有空格.【函数原型】:我们在MSDN里看一下strcat函数的原型【模拟实现】:#include<stdio.h>#include<assert.h>char *my_strc...原创 2018-05-14 17:07:46 · 306 阅读 · 0 评论 -
【经典面试题】:将一个字符数组的内容为:"student a am i"改为"i am a student".
【问题描述】:有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student". >要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。【算法思路】:先将字符数组"student a am i"逆置变为"i ma a tneduts",然后在将字符数组"i ma a tneduts"里边的每一个单词逆置..原创 2018-05-07 22:33:06 · 381 阅读 · 0 评论 -
《剑指offer》:1+2+3+....+n
【问题描述】:编程求1+2+3+…+n要求:不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句。【解决思路】: 这个题目如果没有加要求对每一个都比较熟悉,也都可以求解。我们能够想到的方法有 (1)递归 (2)循环累加 (3)等差数列求和公式 例如:#include<stdio.h>#include<windows.h>int...原创 2018-05-25 13:42:43 · 164 阅读 · 0 评论 -
C语言模拟实现库函数strstr
【函数作用】:判断一个字符串是否为另一个字符串的子串,如果是,则返回第一次出现的首地址。比如strstr(str,string)就是判断字符串string是否是str的子串。如果是,则该函数返回string在str中首次出现的地址;否则,返回NULL【函数原型】:在MSDN中看一下strstr函数的原型【模拟实现】:...原创 2018-05-15 20:30:55 · 1023 阅读 · 0 评论 -
模拟实现库函数strncpy,strncmp,strncat
①模拟实现strncpy函数作用:拷贝count个字符从源字符串到目标空间 如果源字符串的长度小于count,则拷贝完源字符串之后,在目标的后边追加null,直到count个参考代码:#include<stdio.h>#include<assert.h>char *my_strncpy(char *dest, const char *sr...原创 2018-05-26 11:01:01 · 339 阅读 · 0 评论 -
模拟实现库函数strchr、strrchr、memchr
①strchr函数【函数原型】:char* strchr(const char* string,int c);【函数功能】:在一个字符串中查找指定字符的第一次出现的位置。如果查找成功,返回该字符的地址,如果查找失败,则返回 NULL。【参考代码】:#include<stdio.h>#include<assert.h>char *my_strchr(char *str, ...原创 2018-05-26 11:53:35 · 252 阅读 · 0 评论 -
C语言模拟实现库函数strcmp
【函数作用】:strcmp(s1,s2),比较字符串s1和s2。当s1<s2时,返回为负数(注意不是-1);当s1==s2时,返回值= 0;当s1>s2时,返回正数 (注意不是1)【函数原型】:【参考代码】:#include<stdio.h>#include<windows.h>#include<assert.h>int my_strcmp(...原创 2018-05-15 20:42:52 · 562 阅读 · 0 评论 -
C语言模拟实现库函数memcpy
【函数作用】:memcpy函数用于把源内存(sour所指向的内存区域)拷贝到目标内存(dest所指向的内存区域),以拷贝的字节数作为循环结束条件。它可以拷贝任何类型的对象,因为函数的参数类型是void*(无类型指针),但是由于拷贝的过程必须要一个字节一个字节的进行拷贝,所以要把void*强制转化为char*,这样在指针加的时候才会保证每次加一个字节【函数原型】:在MSDN查看函数的原型【参考代码】...原创 2018-05-15 21:21:30 · 181 阅读 · 0 评论 -
【排序】:选择排序(SelectSort)及其优化
选择排序(SelectSort) 选择排序的基本思想:刚开始的时候,有序区没有元素,每一趟在无序区中选出来一个最小的元素,然后与无序区第一个元素交换,则此时有序区多一个元素,而无序区少一个元素,知道无序区元素为0结束。 直接选择排序:第一趟排序在R[0..n]中选出一个最小的元素与R[0]交换,第二趟在R[1..n]中选择最小元素,与第一个与R[1]交换,直到无序区的元素只剩下一个排...原创 2018-06-29 22:39:15 · 7020 阅读 · 2 评论 -
计算两个数平均数的三种方法
第一种方法思路:两数相加然后除以2 参考代码: #include<stdio.h> int main() { int a = 10; int b = 20; int aver = (a + b) / 2; //int aver = (a + b) >> 1;...原创 2018-07-01 08:36:25 · 11991 阅读 · 0 评论 -
输入\输出函数总结
错误报告函数strerror 返回错误码errno所对应的错误信息。标准库函数提供了一个全局变量erron(在头文件errno.h中定义),记录错误的信息,提示错误的原因用法: #include<stdio.h> #include<limits.h> #include<stdlib.h> int main()...原创 2018-07-02 14:47:32 · 235 阅读 · 0 评论 -
结构体、位段、枚举、联合知识的总结
前言:本篇文章用一些例子介绍了结构体、位段、枚举、联合的一些基本知识,文章的重点是一定要会结构体的内存对齐那部分知识,因为这个知识很重要。如果文章那里写的有错误,还请各位朋友指出。结构体什么是结构体 结构体是一些值的集合,这些值称为成员变量。结构体中的每个成员都可以是不同类型的变量结构体的声明一般声明 struct tag { ...原创 2018-07-02 14:50:27 · 389 阅读 · 0 评论 -
回调函数的简单理解及应用
前言:本篇文章是我对回调函数的一个简单的理解,用两个应用:计算器实现和用冒泡的方式实现qsort函数来解释什么是回调函数。回调函数是什么 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件...原创 2018-07-02 14:52:05 · 4728 阅读 · 0 评论 -
【排序】:插入排序(InsertSort)及优化
插入排序(InsertSort) 插入排序是每次讲一个待排序的记录,按照大小,插入到前面已经排好的有序区中适当的位置,直到将所有记录插入完位置。大概思想是将待排序记录放在数组R[0..N]中,R[0]是有序区,R[1..N]为无序区,无序区从R[1]开始按照大小插入到有序区中。以记录R[n]={7,6,2,4,3,0}为例,进行选择排序(升序)。代码实现:void Inser...原创 2018-06-27 22:19:36 · 680 阅读 · 0 评论 -
指针和数组面试常见中题目
前言:本篇文章主要针对前边写的一篇博客指针的深度学习。本篇文章是基于前边所学到的知识的一些练习题目。利用数组和指针的相关知识,解决下边的问题。题目一:下面代码输出结果是什么 #include<stdio.h> int main() { int a[5] = { 1, 2, 3, 4, 5 }; int *p = (i...原创 2018-07-03 16:38:23 · 1019 阅读 · 0 评论 -
求解数组中最大最小元素的几种优化方法
问题描述 给定一个一维数组,同时找到最大最小的元素,并给出优化方法解法一:常规解法(O(n)) 思路:遍历一遍一维数组,一次比较确定最大值和最小值。代码实现:#include<stdio.h>#include<assert.h>void Search_Op(int arr[], int len, int *out_min, ...原创 2018-07-25 11:29:51 · 1848 阅读 · 1 评论 -
#define和typedef哪一个类型重命名更好一些
#define类型重命名#define uint unsigned inttypedef类型重命名typedef unsigned int uint区别:#define进行类型重命名时新类型名字在前边,而用typedef进行类型重命名时,新类型名字在后边哪一个更好呢?请看下面例子:typedef int* pint#define PINT int*//a,b...原创 2018-08-05 10:53:04 · 1833 阅读 · 0 评论 -
动态内存开辟(malloc,calloc,free,realloc)
前言:本篇文章介绍了如何正确利用malloc、calloc、realloc函数的动态开辟我们要使用的内存,还有在进行动态内存开辟的时候常见的一些错误为什么会存在内存开辟?首先,我们回忆一下到目前为止我们掌握的的内存开辟方式有哪些: int a = 0;//在栈区连续开辟4个字节的空间 int arr[10] = { 0 };//在栈区连续开辟40个字节的空间上述...原创 2018-07-02 14:35:27 · 329 阅读 · 0 评论 -
【排序】:冒泡排序以及三种优化
冒泡排序(BubbleSort)一般冒泡排序的写法//假设排序arr[] = { 1, 3, 4, 2, 6, 7, 8, 0 };void BubbleSort(int arr[],int len){ int i = 0; int tmp = 0; for (i = 0; i &amp;lt; len - 1; i++)//确定排序趟数 { ...原创 2018-06-27 00:26:21 · 47635 阅读 · 50 评论 -
宏和函数的区别
1.#define定义宏①宏的定义方式 #define name(参数列表) stuff 在预处理阶段把参数替换到文本当中 例如: #define MAX 100注意: 参数列表和宏名中间不能加空格②宏在运算中的一些陷阱 //下面这段代码输出的结果什么呢? #include<stdio.h> ...原创 2018-07-01 08:38:41 · 764 阅读 · 0 评论 -
大小端详解
前言:本篇文章介绍数据存储的大小端模式,大小端模式起源于吃鸡蛋的典故。 首先,我们看一下数据在内存是怎么存储的 从上边我们可以看出a、b在计算机中存储的是补码,但是顺序却倒着的,这实际上就是小端存储1.大小端定义 大端存储模式:是指数据的低位字节序保存在内存的高地址中,而数据的高位字节序保存在内存的低地址中 小端存储模式:是指数据的低位字节序保存在内存的低地址...原创 2018-07-01 08:57:38 · 3262 阅读 · 0 评论 -
图解函数的栈帧
前言:本篇文章在汇编语言的角度介绍了函数的调用过程,也就是函数的栈帧,如果有什么问题,欢迎指出,共同进步。1.什么是函数栈帧每一次函数的调用都是一个过程,在这个过程中要为函数开辟栈空间,用于本次函数调用中临时变量的保存和现场保护等等。栈是从高地址向低地址延伸的。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(低地址)。2.以Add函数为例,图解栈帧...原创 2018-07-01 09:02:08 · 1164 阅读 · 0 评论 -
浅析可变参数列表
前言:本篇文章介绍了C语言中的可变参数列表。C语言中的可变参数可以通过将函数实现为可以改变参数的形式,可以使得函数可以接受1个以上的任意个参数。如果本篇文章那里有错误的地方,欢迎指出。stdarg宏 可变参数列表是通过宏来实现的,这些宏定义于头文件stdarg.h中。这个头文件声明了一个类型va_list、va_start、va_arg、va_end。可以声明一个类型为va_list的...原创 2018-07-01 09:04:24 · 239 阅读 · 0 评论 -
字符串左旋问题
问题描述 实现一个函数,可以左旋字符串中的k个字符。例如 ABCD左旋一个字符得到BCDA ,ABCD左旋两个字符得到CDAB 解法一:暴力移位法假设将ABCDE左旋转一个字符得到的是BCDEA首先将A储存起来找到’\0’循环结束,避免将’\0’移动然后BCDE逐个向左移动 参考代码: #include<stdio.h> #incl...原创 2018-07-01 09:06:51 · 565 阅读 · 0 评论 -
查找一个数组中非成对的数字问题
前言:本篇文章介绍如何找出一个数组中非成对的一个数字,后边还拓展到求两个非成对的数字和三个非成对的数字中的任意一个。这几个题目主要考察的是我们对异或操作符的掌握程度。问题一:查找数组中一个非成对的数字假设找出数组arr[]={1,1,2,2,3,3,4}中不成对出现的数字,既4.异或的性质:a^a=0;b^0=b.将数组中的所以值安位异或起来就可以找到唯一一个不成对出现的数字,既...原创 2018-07-01 09:10:36 · 807 阅读 · 0 评论 -
指针的深度学习(数组指针、指针数组等)
前言:本篇文章回忆了指针的基本知识,在基本知识的基础上,加深了对指针的理解,然后引出指针数组、数组指针、函数指针灯一系列概念。如果那里写的有问题,欢迎指出。指针是什么 指针是一个变量,用来存放地址的。 #include<stdio.h> int main() { int a = 10;//在内存中开辟一块空间 i...原创 2018-07-01 09:15:21 · 409 阅读 · 1 评论 -
怎样理解代码(*(void(*)())0)()和void (*signal(int,void(*)(int)))(int)
代码一:(*(void(*)())0)()首先代码(void(*)())0是将0强制装换为函数指针类型,然后对它解引用得到0地址处的函数。这个函数无参数和返回类型,这是一个函数的调用。代码二:void (*signal(int,void(*)(int)))(int)首先这是一个是一个函数的声明,signal函数的有两个参数一个是int类型的,一个是函数指针类型的,这个函数指针有一个...原创 2018-07-01 09:18:04 · 340 阅读 · 0 评论 -
C语言实现在屏幕上打印杨辉三角
★杨辉三角是什么?杨辉三角是二项式系数在三角形中的一种几何排列。(好吧!我们不用管这个,只要了解下面这幅图就好了)【算法思路】:观察上边的杨辉三角,我们可以得到一些规律。两边边上的数字都为1,从第三行开始里边的数字都是上边两个数字的和。找到以上规律我们就可以直接在二维数组里进行条件性赋值和输出就可以得到结果了。【参考代码】:#include<stdio.h>#include<w...原创 2018-05-07 20:56:14 · 740 阅读 · 0 评论 -
【C语言】:日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
【问题描述】:日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯 的一个。以下为4个嫌疑犯的供词。 A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说 已知3个人说了真话,1个人说的是假话。 现在请根据这些信息,写一个程序来确定到底谁是凶手。【算法思路】:凶手可能A、B、C、D中的某一个人,因为字母A、B、C、D对应的ASCII码正好是连着的,我们可以根据这个依次遍历一下他们...原创 2018-05-07 19:54:06 · 1184 阅读 · 0 评论