C语言
ETalien_
足够优秀才能接住上天给的惊喜和机会
展开
-
C语言:实现一个通讯录,可以进行增删查改等多项功能(动态版本)
基于前一篇文章的静态通讯录,添加malloc函数,realloc函数以及free,将其改变为一个动态的通讯录,可以动态内存开辟,尽可能防止内存的浪费。具体代码如下:contact.h#ifndef __CONTACT_H__#define __CONTACT_H__#include <string.h>#include <stdlib.h>#include原创 2018-11-03 14:29:56 · 1304 阅读 · 0 评论 -
C语言:宏和函数的对比
在C语言中宏和函数的用法比较相似,那么我们接下来对比一下宏和函数的区别。宏:1.代码长度:由于使用时宏代码都被直接插入到程序中,因此除了较短的宏,程序的长度将大幅度增长2.执行速度:更快3.操作符优先级:宏的求值是在上下文环境中的,因此临近的操作符优先级可能会产生不可预料的结果(所以在使用宏时要尽可能适当的多加括号)4.参数求值:参数每次用于宏定义时,它们都将重新求值。5....原创 2018-07-21 16:27:49 · 1080 阅读 · 0 评论 -
C语言:创建一个数组, 实现函数init()初始化数组、实现empty()清空数组、实现reverse()函数完成数组元素的逆置。要求:自己设计函数的参数,返回值。
创建一个数组, 实现函数init()初始化数组、实现empty()清空数组、实现reverse()函数完成数组元素的逆置。要求:自己设计函数的参数,返回值。 此题的解决思路为:在main函数里设置init函数,empty函数,reverse函数以及print函数,在各个函数内部完成要求。具体代码如下:#define _CRT_SECURE_NO_DEPRECATE#include ...原创 2018-07-21 14:52:55 · 413 阅读 · 0 评论 -
C语言:写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
题目:写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和例如,调用DigitSum(1729),则应该返回1 + 7 + 2 + 9,它的和是19此题的解决思路为:定义一个数字n,若n<9,则函数的返回值直接为n。若n>9,此时要采用递归,拆出n的最后一位,并递归调用DigitSum。具体代码如下:#include <stdio.h&g...原创 2018-08-08 17:02:30 · 1780 阅读 · 0 评论 -
C语言:编写一个函数实现n^k,使用递归实现
此题的解决思路为:n^k可以理解为n*n^k-1,当k=0时,n^0=1。每一次传参的过程都不断地向n^0靠近。这样分析下来代码的大体框架就出来了。具体代码如下:#include <stdio.h>#include <stdlib.h>int fun(int n, int k){ int ret = 0; if (k == 0) { ret = 1...原创 2018-08-03 16:10:38 · 427 阅读 · 0 评论 -
C语言:模拟实现printf函数,能完成print("s ccc d.\n","hello",'m','i',k',100); 的调用。
题目:模拟实现printf函数,可完成下面的功能,能完成下面函数的调用。print("s ccc d.\n","hello",'m','i','k',100);函数原型:print(char *format, ...)此题的解决思路为:根据print函数第一个字符串参数中的字符来判断后面需要打印的是什么类型,如果遇到一个s,说明后面有一个字符串,如果遇到一个c,说明后面有一个字符,如果...原创 2018-08-07 17:53:48 · 664 阅读 · 0 评论 -
C语言:使用可变参数,实现函数,求函数参数的最大值。
此题的解决思路为:求若干个参数的最大值,我们假定第一个可变参数为最大值,定义为max,将之后的每一个可变参数和第一个可变参数相比较,始终在max里存放的是最大值。但是这里需要注意,每一次调用va_arg,都会指向下一个可变参数,因此我们需要将其值储存在临时变量里,以防指向错误。具体代码如下:#include <stdio.h>#include <stdlib.h&...原创 2018-07-31 09:09:34 · 1270 阅读 · 0 评论 -
C语言:使用可变参数,实现函数,求函数参数的平均值。
此题的解决思路为:使用可变参数列表,求若干个参数的平均值,所以我们每次调用va_arg把它的值累加在sum变量里,最后让函数返回sum/n即可求得若干个参数的平均值。具体代码如下:#include <stdio.h>#include <stdlib.h>#include <stdarg.h>int average(int n, ...){ i...原创 2018-08-01 09:36:55 · 1541 阅读 · 0 评论 -
C语言:使用函数实现两个数的交换。
此题的解决思路为:创建一个Swap函数,参数为a和b,函数内部创建一个临时变量tmp,用于交换两个数。但需要注意的是:函数传参的过程中需要注意,形参是实参的一份临时拷贝,形参的改变不会影响实参,所以此时函数传参的时候需要传递实参的地址(&a),即传址调用,在接收部分就要使用指变量来接收(*p),这样可以使实参和形参产生一定的联系。具体代码如下:#define _CRT_SEC...原创 2018-07-20 18:37:01 · 8662 阅读 · 2 评论 -
C语言:实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定, 输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表。
此题的解决思路为:定义一个函数,该函数的参数为口诀表的行列数。 函数内部为口诀表的打印(9*9口诀表在之前的博客中有介绍)。具体代码如下:#define _CRT_SECURE_NO_DEPRECATE#include <stdio.h>#include <stdlib.h>koujue(in...原创 2018-07-20 17:19:58 · 854 阅读 · 0 评论 -
C语言:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同
此题的解决思路为:根据异或我们可以知道,两个数字的二进制位按位异或,相同为0,相异为1。因此我们可以通过将两个数字按位异或,并计算该异或结果中二进制位中1的个数,即可知道有多少个比特位不同。具体代码如下:int count(int a, int b){ int m = a ^ b; // 两个数按位异或,对应不同的位将会置1 int num = 0; while (m>...原创 2018-07-20 17:09:00 · 464 阅读 · 0 评论 -
C语言:输出一个整数的每一位。
此题的解决思路为:使用函数的递归调用来实现。例如:我们要打印1234的每一位,我们可以将此问题化小,定义一个print函数。第一步在print函数里打印123 + 4,第二步打印12 + 3 + 4,第三步打印1 + 2 + 3 + 4,不断的递归调用,直到这个数不在大于9。并且利用if函数判断,若大于9则将1234除以10,并继续调用print函数。注:在使用函数递归调用时需要注...原创 2018-07-20 17:02:01 · 6606 阅读 · 0 评论 -
C语言:获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
此题的解决思路为:将某一个数通过将其二进制位右移,并按位与1,即可获得每个二进制位上的值。奇数位与偶数位的实现可以通过右移的个数来确定。 奇数位:右移0/2/4....位,按位与1(从第30位开始) 偶数位:右移1/3/5....位,按位与1(从第31位开始)具体代码如下:#define _CRT_SECURE_NO_DEPRECATE#includ...原创 2018-07-20 16:36:51 · 312 阅读 · 0 评论 -
C语言:在杨氏矩阵中查找一个数字是否存在
题目:有一个二维数组(杨氏矩阵)数组的每行从左到右是递增的,每列从上到下是递增的。在这样的数组中查找一个数字是否存在。时间复杂度小于O(N)。此题的解决思路为:由于数组的每行从左到右是递增的,每列从上到下是递增的,因此右上角的这个数为该数所在这一行最大的数,为该数所在这一列最小的数,我们以数组右上角的这个数为基准进行比较。若我们要查找的这个数大于右上角的这个数,而右上角的这个数是这一行中最大的...原创 2018-07-29 15:06:07 · 361 阅读 · 0 评论 -
C语言:函数的调用过程(栈帧)
在C语言中函数是如何调用的?我们通过下方这个简单的代码来进行深入研究。#include <stdio.h>#include <stdlib.h>int Add(int x, int y){ int i = 0; i = x + y; return i;}int main(){ int a = 10; int b = 20; int...原创 2018-07-21 21:08:31 · 318 阅读 · 0 评论 -
C语言:深度解析可变参数列表
C语言的可变参数是通过将函数实现为可变参数的形式,可以使得函数可以接收一个以上的任意多个参数(不固定)。一.举例首先我们先来看一个例子:实现一个函数可以求任意个参数的平均值#include <stdio.h>#include <stdlib.h>#include <stdarg.h>int average(int n, ...){ int...原创 2018-07-27 08:11:12 · 270 阅读 · 0 评论 -
C语言:实现一个函数,可以左旋字符串中的k个字符。
题目:实现一个函数,可以左旋字符串中的k个字符。ABCD左旋一个字符得到BCDA,ABCD左旋两个字符得到CDAB。此题的解决思路有两种:①暴力移位法 ②三步翻转法方法一:暴力移位法首先我们定义一个tmp,将这个字符串中的第一个字符保存起来,然后将字符串后面所有的字符向前移动,最后将保存的第一个字符放在最后。左旋k个字符就循环k次,就可以实现。但是此方法没有考虑效率问题,如果左旋...原创 2018-08-09 10:43:17 · 264 阅读 · 0 评论 -
C语言:实现一个通讯录,可以进行增删查改等多项功能(静态版本)
实现一个通讯录通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:添加联系人信息删除指定联系人信息查找指定联系人信息修改指定联系人信息显示所有联系人信息清空所有联系人以姓名排序所有联系人Contact.h (头文件)如下:#ifndef __CONTACT_H__#define __CONTACT_H__#include ...原创 2018-11-02 14:38:08 · 1064 阅读 · 1 评论 -
C语言:判断当前计算机的大小端储存
大小端大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。 小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。编写程序计算当前计算机的大小端存储方法一#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;int check_sys(){ in...原创 2018-09-02 20:03:28 · 346 阅读 · 0 评论 -
C语言:模拟实现strncpy,strncat,strncmp
strncpy、strncat、strncmp函数与strcpy、strcat、strcmp函数非常相近,在实现功能上也十分接近。 但是在“str…”函数里,它是用自身的字符数组长度来判断循坏的停止条件,在一些情况下这是不安全的,比如在strcat函数,我们给arr追加arr时,程序就会崩溃。所以,用自身的长度来作为循环停止条件是不安全的。 所以我们引入“strn…”函数模拟实现str...原创 2018-09-04 22:02:49 · 188 阅读 · 0 评论 -
C语言:字符函数和字符串函数
一.求字符串长度strlensize_t strlen(const char *str);1.字符串已经\0作为结束标志,strlen函数返回的是在字符串中\0前面出现的字符个数(不包含\0) 2.参数指向的字符串必须要以\0结束 3.注意函数的返回值为size_t,是无符号的二.长度不受限制的字符串函数strcpy(字符串拷贝)char *strc...原创 2018-08-25 23:21:35 · 343 阅读 · 0 评论 -
C语言:模拟实现一个计算器(可以完成加减乘除运算)
使用switch…case…语句实现#define _CRT_SECURE_NO_DEPRECATE 1#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;int add(int x, int y){ return x + y;}int sub(int x, int y){ return x - y;}int ...原创 2018-08-21 23:30:54 · 28445 阅读 · 0 评论 -
C语言:回调函数。使用回调函数模拟实现qsort。
一.回调函数1.回调函数定义回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为函数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这个是回调函数。 回调函数不是由该函数的实现方直接调用,而是在特定的事件或者条件发生时,由另一方调用的,用于对该事件和条件进行响应。2.回调函数简单举例void test(){ printf(&amp;amp;quot;hehe&amp;amp;quot;.原创 2018-08-24 22:47:34 · 221 阅读 · 0 评论 -
C语言:写冒泡排序可以排序多个字符串。
此题的解决思路为:首先整体思路为冒泡排序法,其次它是要排序多个字符串,这里就要用到字符串的比较strcmp,通过判断比较两字符串然后再进行交换排序。 具体代码如下:#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;void bubble_str(char *arr[], int sz)...原创 2018-08-23 21:16:37 · 791 阅读 · 0 评论 -
C语言:函数指针、函数指针数组、函数指针数组的指针
一.函数指针1.定义理解函数指针:是一个指针,存放函数地址的指针。函数的地址可以通过取地址函数名拿到,也可以通过函数名直接拿到。2.函数指针(1)定义一个函数testvoid test(char *str){ printf(&amp;amp;quot;%s\n&amp;amp;quot;,str);}int main(){ //函数指针的定义方式 void (*p)(char *原创 2018-08-20 22:12:29 · 492 阅读 · 0 评论 -
C语言:main函数参数解析。编写程序可以通过接收参数实现简易整数计算器。
一.main函数参数解析1.main函数的原型int main(int argc,char *argv[],char *envp[]){ program-statements}2.各个参数1.第一个参数:argc argc是一个整型变量,表示命令行参数的个数(含第一个参数)。 2.第二个参数:argv argv是一个字符指针的数组,每一个元素是一个字符指针,...原创 2018-08-22 22:14:02 · 1707 阅读 · 0 评论 -
C语言:结构体,枚举,联合
一.结构体类型创建结构体是一些值的集合,这些值称为成员变量。结构体的每一个成员可以是不同类型的变量。结构体的声明struct tag{ member-list;}variable-list;举例: 描述一个学生:struct Stu{ char name[20];//名字 int age;//年龄 char sex[5];//性别 cha...原创 2018-08-26 23:51:52 · 359 阅读 · 0 评论 -
C语言:指针数组和数组指针
一.指针数组1.定义理解指针数组:指针数组可以说是“指针的数组”,顾名思义,首先这是一个数组,其次“指针”修饰这个数组,也就是说这个数组里的所有元素都是指针类型,在32位系统中,指针占4个字节。2.指针数组首先我们定义一个指针数组,既然是一个数组,那么我们起名为arrchar* arr[3]={&quot;zhangsan&quot;,&quot;lisi&quot;,&quot;wangwu&原创 2018-08-19 23:33:06 · 259 阅读 · 0 评论 -
C语言:模拟实现memcpy,memmove
模拟实现memcpy 此题的解决思路为:内存拷贝,将原数组中的内容拷贝到目标数组中,因为不知道拷贝内容的类型,所以设计函数时使用的是void*来接收,在函数内部进行强制类型转换,然后通过循环进行内容的拷贝。具体代码如下:#include &amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;gt;#include &amp;amp;amp;amp;amp;lt;stdlib原创 2018-08-12 19:16:26 · 170 阅读 · 0 评论 -
C语言:模拟实现strcpy ,strcat ,strstr,strchr,strcmp
模拟实现strcpy 此题的解决思路为:将原字符串拷贝到目标字符串中,把原字符串的每一个字符都拷贝过去,直到遇到‘\0’,把‘\0’也拷贝过去之后,停止拷贝。具体代码如下:#include &amp;amp;amp;lt;stdio.h&amp;amp;amp;gt;#include &amp;amp;amp;lt;stdlib.h&amp;amp;amp;gt;#include &am原创 2018-08-11 23:02:01 · 213 阅读 · 0 评论 -
C语言:调整数组使奇数全部都位于偶数前面。
题目:输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。此题的解决思路为:拿到一组数据,我们从左边开始找一个偶数,从右边开始找一个奇数,找到之后将这两个值交换,循环进行即可将所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。思路详解:将数组的首元素地址和元素个数传递到swap函数中。在函数内部定义一个存放左地...原创 2018-07-28 13:19:17 · 1001 阅读 · 0 评论 -
C语言:有一个字符数组的内容为:student a am i, 请你将数组的内容改为i am a student
此题的解决思路为:首先将"student a am i"整体逆置,则得到" i ma a tneduts",然后在这个字符串中,将每一个字符逆置即可得到"i am a student"。思路详解:逆置整个字符串和逆置一个单词我们可以定义一个swap函数,在swap函数内部完成逆置。我们把需要把逆置部分的起始元素地址和结束元素地址传递给swap函数,此时用一个左指针left接收逆置部分的起始...原创 2018-07-26 08:20:35 · 679 阅读 · 0 评论 -
C语言:求出0~999之间的所有“水仙花数”并输出
此题的解决思路为:①首先确定输入的这个数是几位数 ②拆下这个数的每一位进行水仙花的计算 ③进行判断 具体代码如下:#include<stdio.h>#include<math.h>int main()...原创 2018-06-10 17:56:36 · 345 阅读 · 0 评论 -
C语言:输出菱形图案
此题的解决思路为:将菱形分为上半部分和下半部分,分别打印。 具体代码如下:#include<stdio.h>int main(){ int line; scanf_s("%d", &line); int i; for (i = 0; i < line - 1; i++)//打印line行 { int j = 0; for (...原创 2018-06-10 17:51:51 · 12534 阅读 · 1 评论 -
C语言:编写程序数一下 1到 100 的所有整数中出现多少次数字9
此题的解决思路为:取出1-99之间的每一位数的个位和十位,若等于9则count++ 取出个位的方法为a/1%10 取出十位的方法为a/10%10 具体代码如下:#include <stdio.h>#include <stdlib.h>int main(){ int a = 0; int count = 0; fo...原创 2018-06-10 17:46:25 · 340 阅读 · 0 评论 -
C语言:计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值
此题的解决思路为: ①使用for循环,对于正负号的变换则定义一个flag,在每次循环完成时给flag乘-1,这样正负号就变换好了 ②for循环里面的i在每次循环过后都会加1,所以该式子的分母则使用i ③由于运算结果为浮点型,所以定义sum时定义的类型为double型 具体代码如下:#include <stdio.h>#in...原创 2018-06-10 17:41:39 · 1385 阅读 · 0 评论 -
C语言:将数组A中的内容和数组B中的内容进行交换。(数组一样大)
此题的解决思路为:利用for循环以及数组下标的引用,将两个数组中下标相同的元素进行互换,即可完成数组A中的内容和数组B中的内容交换。 具体代码如下:#include <stdio.h>#include <stdlib.h>int main(){ int arr1[] = { 1, 2, 3, 4, 5 }; int arr2[] = { ...原创 2018-06-10 17:33:45 · 658 阅读 · 0 评论 -
C语言:操作符总结
一、算数运算符 +加 -减 *乘 /除 %取模1.除法运算:若两个操作数都为整数则进行整数除法,若两个操作数有一个为浮点数则进行浮点数除法。2.取模操作符的两个操作数都必须为整数。二、移位操作符 <<左移 >>右移1.<<左移:移动二进制序列,向左移动,左边遗弃,右边补02.>>右移:...原创 2018-06-09 18:04:21 · 371 阅读 · 0 评论 -
C语言:求n的阶乘/求1!+2!+.....+n!
首先求n的阶乘,我们先要产生1-n的数字,然后累乘起来,利用for循环来实现。 所以求n的阶乘的具体代码如下:#include <stdio.h>#include <stdlib.h>int main(){ int i = 0; int n = 0; int ret = 1; scanf_s("%d", &n);//输入n ...原创 2018-06-07 14:44:05 · 32967 阅读 · 5 评论 -
C语言:求10个整数中的最大值
此题的解决思路为:将一组数组中的每一个数与这组数的第一个数进行比较,若这个数比第一个数大,则交换两个数。利用for循环来实现。 代码如下:#include<stdio.h>int main(){ int arr[] = { -1, 2, -3, 8, -9, 56, -7, -4, 15, 86}; int max = arr[0]; int i...原创 2018-06-05 13:36:13 · 2005 阅读 · 0 评论