C语言
C语言学习记录
KamikazePilot
编程新人,希望做高级U3D
展开
-
C语言实现归并排序
思路:创建一个动态空间(*p)作为排序辅助数组,其大小为(right - left + 1) * sizeof(int)。归并排序每次递归的动作:将给定数组以中点为界,分为左右两部分,且左右两边的数字分别有序。(至于如何将它做到分别有序,则需使用递归实现) 使用两个指针 L(初始值为左边界) 和 R(初始值为中点右侧的第一个数字 mid + 1) ,分别指向左右两边的左节点,比较指针指向的两个数字; 如果左侧的数字小于等于右侧的数字,则将左侧的数字拷贝进入动态空间p,然后L++; 如果左侧原创 2022-04-07 14:45:57 · 4220 阅读 · 1 评论 -
C语言:模拟实现一个offsetof宏,计算结构体中某变量相对于起始地址的偏移
offsetof定义:size_t offsetof( structName, memberName );这个宏实现传结构体类型,还有成员变量名,计算结果以size_t类型返回。 这里的实现本质上是直接将指针的偏移量强制转化成整形来计算。 首先需要知道的是:指针每偏移一位,跳过的是一个字节byte,即8bit。 那么计算偏移量,可以直接不计算结构体中每个成员的大小,内存分配等问题,直接计算指针偏移量就可以。具体实现:1、定义一个常量0。2、将这个0强制类型转换位结构体指针类型(st原创 2022-03-05 23:48:12 · 906 阅读 · 1 评论 -
C语言 实现将一个整数的二进制位的奇数位和偶数位交换
解题思路:首先要做的是:分别提取给出整数的奇数位和偶数位,即:提取奇数位:(N) 位运算与& 10101010101010101010101010101010 => 0xaaaaaaaa提取偶数位:(N) 位元素与& 01010101010101010101010101010101 => 0x55555555将奇数位左移一位,偶数位右移一位相加移位后结果(或者位运算或)。#define SWAP(N) (((N) & 0xaaaaaaaa)>原创 2022-03-05 23:18:03 · 1190 阅读 · 0 评论 -
C语言:模拟实现atoi函数
atio函数:int atoi( const char *string );这个函数返回一个整形的值,接收字符指针参数。其主要功能为:提取出字符串中的第一段数字部分、数字之前的符号,并以整形的方式返回给程序。例:输入字符串:" 231asds"返回: "231"输入字符串:" -9864"返回: "-9864"输入字符串:"123 456"返回:"123" 这道题库函数atoi给出的实现是无法跳过数字之前的字母的,如果输入:"as123",那么返回...原创 2022-03-05 18:07:04 · 409 阅读 · 0 评论 -
C语言:通讯录的简单实现
题目要求://实现一个通讯录; //通讯录可以用来存储人的信息,每个人的信息包括: //姓名、性别、年龄、电话、住址 //提供方法: //1.添加联系人信息 //2.删除指定联系人信息 //3.查找指定联系人信息 //4.修改指定联系人信息 //5.显示所有联系人信息 //6.清空所有联系人 //7.以名字排序所有联系人 //0.退出原创 2022-03-03 18:47:25 · 1047 阅读 · 0 评论 -
公务员面试现场打分,有七位考官,从键盘输入若干组成绩,每组7分,去掉一个最高分和一个最低分,输出每组平均成绩
输入:7个整数 输出:除最高分和最低分的平均成绩,保留小数点后两位,每行输出后换行 示例: 输入:99 45 78 67 72 88 60 输出:73.00这道题如无必要可以不用数组来存储成绩,使用整形接收成绩,可以提高效率,复用性。输入求平均值可以使用整形接收并直接加入sum,记录max,min。可以在一次循环中完成 int score = 0; //分数 int max = 0; /...原创 2022-02-28 14:43:50 · 1947 阅读 · 0 评论 -
C语言:用 * 打印X形图案
多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线长度。针对每行输入,输出用"*"组成的x型图案。第一次看到这道题,我想到的是按照寻找规律的方法来求解,将n / 2作为分割点,上下分开寻找规律打印空格。网上给出的解题思路是以坐标轴的方式进行求解以输入n = 7为例,由上图可知,设横轴为x,纵轴为y,当x = y,或者x + y = n - 1时,屏幕上输出 *,所以我们可以根据这个规律来进行运算。这种方法的好处是不需要考虑空格的输出的规律,只需要根据交.原创 2022-02-28 14:25:18 · 4197 阅读 · 4 评论 -
C语言模拟实现memcmp函数
memcmp函数:int memcmp(const void *buf1, const void *buf2, size_t count);其作用类似于strcmp,也是逐字节比较大小,从低位到高位依次进行接收void类型,所以需要强制类型转换后才能解引用操作。#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<assert.h>int MyMemcmp(const void *buf1,原创 2022-02-22 23:11:26 · 961 阅读 · 0 评论 -
C语言模拟实现memmove函数
memmove函数:void *memmove(void *dest, const void *src, size_t count);memmove函数和memcpy函数的作用区别主要在于cpy不能拷贝内存重叠的数据,而move考虑到了内存重叠时需要进行的操作。当dest位置更高,并且两块数据重叠时,直接从左向右拷贝会导致已拷贝的数据覆盖掉还未拷贝的数据:src在内存中位置高于dest,数据应当从左向右拷贝srt在内存种位置低于dest,数据应当从右向左拷贝#define _CR原创 2022-02-22 22:44:23 · 270 阅读 · 0 评论 -
C语言模拟实现memcpy函数
memcpy函数:void *memcpy(void *dest, const void *src, size_t count);因为这里进行的是内存拷贝,要保证这个函数能接收各种类型的数据,所以这里的函数返回值和接收类型都是void*类型,和之前模拟实现qsort函数的思路相同。需要将传进来的指针强制类型转换成 char * 类型,因为char类型字符只存储一个字节,并且count指的需要拷贝的字节数量,转换成char*类型是最佳选择。#define _CRT_SECURE_NO_WA原创 2022-02-22 21:26:39 · 413 阅读 · 0 评论 -
C语言模拟实现strcmp,strncmp函数
strcmp函数:int strcmp(const char *string1, const char *string2);strcmp函数比较的是字符转换成ASCII码值的大小,其顺序是从字符串低位向高位挨个比较如abc 和acb,a = a,所以比较下一位,b < c,所以abc < acb.#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<assert.h>int M原创 2022-02-22 17:40:37 · 582 阅读 · 0 评论 -
C语言模拟实现strcpy,strncpy函数
strcpy函数:char *MyStrcpy(char *strDestination, const char *strSource);这个函数只需要实现拷贝功能即可注意拷贝时\0也需要拷贝以下面代码为例,拷贝完成后dest内存储的是:{ 'b', 'b', 'c', '\0', 'b', 'b', 'b', 'c', 'd', 'a', '\0', '\0' ...}但是输出结果为source中的函数: bbc#define _CRT_SECURE_NO_WARNINGS 1原创 2022-02-22 16:58:06 · 516 阅读 · 0 评论 -
C语言模拟实现strcat,strncat函数
追加函数strcat实现思路:在目标函数中找到元素为0的位置,将source字符串中的字符依次赋值给目标函数中0和0位置之后的空间,直到source中的值为\0为止。由于需要返回char* 类型,所以需要创建零时变量pd储存起始时destination位置。#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<assert.h>char *MyStrcat(char *strDestination,原创 2022-02-22 16:19:37 · 467 阅读 · 2 评论 -
C语言递归模拟实现strlen函数
size_t指的是unsigned int类型递归时需要注意结束条件的书写写递归函数时需要注意如果写出的递归有大量重复计算,便不考虑递归的写法#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<assert.h>size_t MyStrlen(const char *string){ assert(string != NULL); if (*string == 0) return 0;原创 2022-02-22 15:57:07 · 300 阅读 · 0 评论 -
C语言模拟实现strstr函数
strstr函数指的是在目标字符串 string 中寻找是否存在子字符串 strCharSet.先找到strstr函数定义:char *strstr(const char *string, const char *strCharSet);这里使用 char* 接收地址并且作为返回值。并且接收的string 和 strCharSet地址使用了const修饰,所以这两个值不能修改。模拟实现思路:1、由于const修饰的地址不能被修改,并且这里后续运算需要变动指针的值,所以需要创建新的指原创 2022-02-22 15:35:09 · 521 阅读 · 0 评论 -
写一个函数,判断这个字符串是否为另一个字符串旋转之后的字符串
字符串左旋的定义:给定字符串arr[] = "abcdef";整形k ;k = 1时字符串变为:bcdefak = 2时字符串变为:cdefab...穷举法解题思路:给出两个字符串求左旋是否相等,首先左旋其中的一个数组,每旋转一次判断一次是否相等,相等返回1,反之返回0。#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<string.h>int FlipCheck(char.原创 2022-02-19 20:38:33 · 454 阅读 · 0 评论 -
字符串左旋:实现一个函数,可以左旋字符串中的k个字符
给定字符串arr[] = "abcdef";整形k ;k = 1时字符串变为:bcdefak = 2时字符串变为:cdefab...思路一:将整个字符串左转一位,循环k次,达到效果#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<string.h>void LeftFlip1(char* arr, int k, int size){ int i = 0; for (i =原创 2022-02-19 20:26:20 · 366 阅读 · 0 评论 -
模拟实现qsort库函数
qsort函数的主要作用是排序,排序base数组,需要通过num(size),width(sizeof(数组首元素)),需要用到函数compare。它的主要特点是可以传入任意类型的数组如:int类型,char,struct结构体等。原创 2022-02-17 21:39:05 · 380 阅读 · 0 评论 -
C语言中的回调函数
回调函数:通过函数指针调用的函数。如果把函数指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另一方调用的,用于对该事件或者条件进行响应。例如:void A(){ ;}void B(void(*Pa)()){ ;}int main(){ B(A); return 0;}B(A)调用的时候称这个函数为回调函数其中调用函数的参数必须是...原创 2022-02-15 22:12:16 · 227 阅读 · 0 评论 -
关于函数指针和函数指针数组
void test(int **ptr) //test形参为一个二级指针{ **ptr = 20;}int main(){ int a = 10; int* pa = &a; //一级指针 int** ppa = &pa; //二级指针 test(ppa); //直接传二级指针 test(&pa); //取地址一级指针 int * arr[10] = { 0 }; test(arr); //传一级指针数组也是被允许的 ret.原创 2022-02-15 21:34:40 · 486 阅读 · 0 评论 -
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水。C语言实现。
由题可知,本题关键在于空瓶子可以换汽水,那么换了汽水以后又会有新的空瓶子,用这些空瓶子还可以再次换到汽水,依次往复,当瓶子数为奇数时,空瓶子可以存储起来,当空瓶子数量为1时再加入循环,类推得到结果。 int x = 20; //设置瓶子总数 int n = 0; //n为饮料总量 int d = 0; //d为多余的瓶子 while (x > 1) //空瓶子个数为1时循环结束 { n += x原创 2022-02-14 11:20:23 · 900 阅读 · 0 评论 -
将输入的字符串中的单词逆序,以空格隔开
输入: "student a am i", 输出: "i am a student". 要求: 不能使用库函数。 只能开辟有限个空间(空间个数和字符串的长度无关)。原创 2022-02-12 16:18:38 · 1266 阅读 · 0 评论 -
已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手。
已知3个人说了真话,1个人说的是假话。现在请根据这些信息,写一个程序来确定到底谁是凶手。原创 2022-02-11 15:44:00 · 803 阅读 · 0 评论 -
关于指针数组和数组指针的区别,数组传参的方式
一、指针数组和数组指针: 1、下题判断输出: char str1[] = "hello world"; char str2[] = "hello world"; const char* str3 = "hello world"; const char* str4 = "hello world"; if (str1 == str2) printf("str1 与 str2 相同\n"); else print...原创 2022-02-10 21:14:55 · 353 阅读 · 0 评论 -
浮点型在内存中的储存
浮点型在内存中的储存原创 2022-02-10 15:12:43 · 205 阅读 · 0 评论 -
整形数据在内存中的存储方式
一,整形家族:char (unsigned char) (signed char)short (unsigned short) (signed short) [int]int (unsigned int) (signed int)long (unsigned long) (signed long) [int]数据在计算机中都以二进制方式存储整数的二进制分3种表示形式:原码,反码,补码正整数的原反补码相同负数原码符号位取1,其余位与其绝对值的取值表现形式相同...原创 2022-02-09 17:25:10 · 1840 阅读 · 0 评论