C语言应用
普朗克三号粉丝
这个作者很懒,什么都没留下…
展开
-
C语言:猴子吃桃问题。
猴子第一天吃了若干个桃子,当即吃了一半,还不解馋,又多吃了一个; 第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了。问第一天共吃了多少个桃子?Day10-----------------------1Day9------------------------ 4Day8------------------------ 10Day7-------------------------22Day6-----------------原创 2021-03-04 15:14:48 · 203 阅读 · 0 评论 -
C语言:offsetof()的用法
offsetof()是一个宏返回的是: 结构体成员 在内存中的偏移量。#include<stdio.h>#include<stddef.h>struct S{ char c1; int a; char c2;};int main(){ //offsetof()返回 结构体成员 在内存中的偏移量 printf("%d\n", offsetof(struct S, c1));//0 printf("%d\n", offsetof(struct S, a));/原创 2021-02-01 20:33:53 · 9725 阅读 · 0 评论 -
C语言:#include <filename.h> 和 #include “filename.h“的作用
#include <filename.h>查找头文件直接去标准路径下去查找,如果找不到就提示编译错误。#include "filename"先在源文件所在目录下查找,如果该头文件未找到,编译器就像查找库函数头文件一样在标准位置查找头文件。 如果找不到就提示编译错误。对于库文件也可以使用 “” 的形式包含但是这样做查找的效率就低些,当然这样也不容易区分是库文件还是本地文件了...原创 2021-02-01 19:41:22 · 1132 阅读 · 0 评论 -
C语言:头文件中的 ifndef/define/endif的作用。
#ifndef __TEST_H__//如果__TEST_H__没有定义,就执行下列语句#define __TEST_H__//定义__TEST_H__//头文件的内容#endif //结束标志等同于:#pragma once//保证头文件只引入一次就可以避免头文件的重复引入。...原创 2021-02-01 19:38:23 · 1021 阅读 · 0 评论 -
C语言:宏(3)命名约定与#undef的用法
目录一、命名约定二、#undef的用法一、命名约定一般来讲函数的宏的使用语法很相似。所以语言本身没法帮我们区分二者。 那我们平时的一个习惯是:把宏名全部大写 函数名不要全部大写二、#undef的用法#undef 这条指令用于移除一个宏定义#define MAX 10#include<stdio.h> int main(){ printf("%d\n", MAX);//打印10#undef MAX printf("%d\n", MAX); return 0;}.原创 2021-02-01 19:35:00 · 341 阅读 · 0 评论 -
C语言:宏(2)宏和函数对比
例如MAX(a+b)如果是函数的话,会将a+b的结果传过去;如果是宏的话,就将 a+b 替换过去。例如执行a++,或者b++;执行完之后会改变a和b的值。原创 2021-02-01 18:02:35 · 101 阅读 · 0 评论 -
C语言:宏(1) #和##的用法
使用 # ,可以把一个宏参数变成对应的字符串#include<stdio.h>#define PRINT(X) printf("the "#X" value is %d\n",X);int main(){ int a = 2; int b = 3; PRINT(a); PRINT(b); return 0;}##可以把位于它两边的符号合成一个符号。 它允许宏定义从分离的文本片段创建标识符#include<stdio.h>#define A(X,Y)原创 2021-02-01 17:19:55 · 712 阅读 · 0 评论 -
C语言:文件(9)ftell()、rewind()、feof()、perror()、ferror()
ftell()返回文件指针相对于起始位置的偏移量long int ftell ( FILE * stream );rewind()让文件指针的位置回到文件的起始位置void rewind ( FILE * stream );#include<stdio.h>int main(){ FILE* pf = fopen("text.txt","r"); if (pf==NULL) { perror("text.txt");//打印出 text.txt: 错误信息原创 2021-01-31 21:44:58 · 189 阅读 · 0 评论 -
C语言:文件(8)fseek
int fseek ( FILE * stream, long int offset, int origin )fseek()的使用:#include<stdio.h>//text.txt存放abcdefint main(){ FILE* pf = fopen("text.txt", "r"); if (pf==NULL) { return 0; } fseek(pf, 2, SEEK_CUR); char ch = fgetc(pf); printf("%c\n"原创 2021-01-31 21:09:36 · 118 阅读 · 0 评论 -
C语言:文件(7)fwrite和fread
fwrite#include<stdio.h>struct S{ char arr[20]; int age; double f;};int main(){ struct S s = { "张三",15,2.13 }; FILE* f = fopen("text.txt", "wb"); if (f==NULL) { return 0; } //从结构体s中将1个大小为sizeof(struct S)的数据写入到f中 fwrite(&s, sizeo原创 2021-01-31 18:04:34 · 133 阅读 · 0 评论 -
C语言:文件(6)sscanf和sprintf
#include<stdio.h>struct S{ int n; float f; char arr[20];};int main(){ struct S s = { 2,1.2,"asdf" }; struct S t = { 0 }; char buf[100] = { 0 }; //将格式为"%d %f %s"的s.n, s.f, s.arr 以字符串的方式保存buf中 sprintf(buf, "%d %f %s", s.n, s.f, s.arr); /原创 2021-01-31 17:43:43 · 98 阅读 · 0 评论 -
C语言:文件(5)fscanf和fprintf
格式化输入函数 fscanf格式化输出函数 fprintf#include<stdio.h>struct S{ int a; float b; char c[20];};int main(){ struct S s = { 0 }; fscanf(stdin, "%d %f %s", &s.a, &s.b, &s.c);//从键盘上接收 fprintf(stdout, "%d %g %s", s.a, s.b, s.c);//打印到屏幕上 r原创 2021-01-31 17:07:26 · 188 阅读 · 1 评论 -
C语言:文件(4)fgets和fputs。
文本行输入函数 fgets#include<stdio.h>int main(){ char arr[1024] = { 0 }; FILE* f = fopen("text.txt", "r"); if (f==NULL) { return 0; } //读文件 fgets(arr, 1024, f);//fgets每次打印一行,打印时会自动换行。 //arr存储的位置,1024为arr的最大容量,f为存储的文件指针 printf("%s", arr);//打印a原创 2021-01-31 16:29:53 · 211 阅读 · 0 评论 -
C语言:文件(3) fputc和fgetc
字符输出函数 fputc#include<stdio.h>#include<string.h>#include<errno.h>int main(){ FILE* f = fopen("text.txt", "w");//打开文件 if (f==NULL) { printf("%s\n", strerror(errno)); return 0; } //写文件 fputc('a', f); fputc('b', f); fputc('c'原创 2021-01-31 15:50:41 · 163 阅读 · 0 评论 -
C语言:文件(2)打开和关闭
文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。#include<stdio.h>#include<string.h>#include<errno.h>int main(){ FILE* f = fopen("text.txt", "w"); //若根目录下存在text.txt文件,就会清空里面的数据,若根目录下不存在text.txt文件,就会创建text.txt文件。 //创建成功,返回文件指针,不成功,返回NULL. if (f==NULL原创 2021-01-31 15:38:16 · 237 阅读 · 0 评论 -
C语言:文件(1)
这里写目录标题一、什么是文件二、文件名一级目录一级目录一、什么是文件在程序设计中,我们一般谈的文件有两种:程序文件、数据文件。程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。二、文件名一个文件要有一个唯一的文件标识,以便用户识别和引用。文件名包含3部分:文件路径+文件名主干+文件后缀例如: c:原创 2021-01-31 15:17:27 · 181 阅读 · 0 评论 -
C语言:柔性数组
目录一、概念二、使用三、优势一、概念struct s//占4个字节{ int i; int a[0];//柔性数组成员};有些编译器会报错无法编译可以改成:struct s//占4个字节{ int i; int a[];//柔性数组成员};柔性数组的特点:1、结构中的柔性数组成员前面必须至少一个其他成员。2、sizeof 返回的这种结构大小不包括柔性数组的内存。3、包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔原创 2021-01-30 18:01:54 · 172 阅读 · 0 评论 -
C/C++程序的内存开辟
栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配方式类似于链表。数据段(静态区)(static)存放全局变量、静态数据。程序结束后由系统释放。代码段:存放函数体(类成员函数和全局函数)的二进制代码。.原创 2021-01-30 16:47:46 · 240 阅读 · 1 评论 -
C语言:动态内存函数(3)常见的动态内存错误.
1、对NULL指针的解引用操作void test(){int *p = (int *)malloc(INT_MAX);//申请空间过大,返回NULL指针*p = 20;//如果p的值是NULL,就会有问题free(p);}2、对动态开辟空间的越界访问void test(){ int i = 0; int *p = (int *)malloc(10*sizeof(int)); if(NULL == p) { printf("%s\n",strerror(errno); }原创 2021-01-30 15:55:54 · 131 阅读 · 1 评论 -
C语言:动态内存函数(2)calloc和realloc
void* calloc (size_t num, size_t size)1、函数的功能是为 num 个大小为 size个字节 的元素开辟一块空间,并且把空间的每个字节初始化为0。2、与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。...原创 2021-01-30 15:25:53 · 129 阅读 · 0 评论 -
C语言:动态内存函数(1)malloc和free
void* malloc (size_t size)这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。1、如果开辟成功,则返回一个指向开辟好空间的指针。2、如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。3、返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。4、如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。void free (void* ptr);free函数用来原创 2021-01-30 10:58:40 · 124 阅读 · 0 评论 -
C语言:联合体大小的计算。
联合的大小至少是最大成员的大小。当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。例如:#include<stdio.h>union un{ char arr[5];//对齐数为1,所占5个字节 int i;//对齐数为4,所占4字节}u;//所占最大字节数(5)一定要是最大对齐数(4)的倍数。//所以最大字节数提升到8字节,就是该联合体的大小int main(){ printf("%d", sizeof(u));//8 return 0;}原创 2021-01-29 16:47:11 · 1397 阅读 · 0 评论 -
C语言:联合体测试计算机大小端存储。
测试计算机大小端存储的两种方法:一般方法:#include<stdio.h>int check_sys(){ int a = 1; // 0x 00 00 00 01 // 低地址---->高地址 //...[][][][01][00][00][00][][][]... 小端 //...[][][][00][00][00][01][][][]... 大端 return *(char*)&a;//返回第一个字节的数值}int m原创 2021-01-29 16:33:41 · 149 阅读 · 0 评论 -
C语言:枚举。
一、定义:枚举就是一一列举。例如:enum Day//星期{ Mon, Tues, Wed, Thur, Fri, Sat, Sun};enum Sex//性别{ MALE, FEMALE};以上定义的 enum Day , enum Sex都是枚举类型。 {}中的内容是枚举类型的可能取值,也叫 枚举常量,这些可能取值都是有值的,默认从0开始,一次递增1。当然在定义的时候也可以赋初值,未赋值的成员从已赋值的成员开始,逐次增1。例如:enum Day//星期{原创 2021-01-29 15:57:04 · 117 阅读 · 0 评论 -
C语言:位段。
文章目录一、什么是位段二、位段的内存分配三、位段的跨平台问题总结一、什么是位段1、位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型。2、位段的成员名后边有一个冒号和一个数字。例如:struct S1{int a:2;int b:5;int c:10;int d:30;};----------struct S{char a:3;char b:4;char c:5;char d:4;};二、位段的内存分配原创 2021-01-29 12:03:58 · 131 阅读 · 0 评论 -
C语言:结构体内存对齐。
为什么存在内存对齐?平台原因(移植原因): 某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。性能原因: 对齐可以使得读取数据的次数使得不对齐时的次数要少。内存对齐规则:1.第一个成员在与结构体变量偏移量为0的地址处。2.其他成员变量要存储到对齐数的整数倍的地址处。(对齐数=min[编译器默认值,该成员变量的字节大小]VS中默认的值为8)3.结构体总大小一定要是最大对齐数的整数倍(每个成员变量都有一个对齐数)。4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大原创 2021-01-27 20:21:11 · 107 阅读 · 0 评论 -
C语言:memset();
#include<stdio.h>int main(){ int arr[10] = { 0 }; //arr[10]共40个字节 memset(arr, 1, 10);//讲arr中前10个字节的数据 设置为1; //只改前10个字节 --16进制如下: //01 01 01 01 01 01 01 01 01 01 00 00 00... // 16843009 16843009 257 return 0;}原创 2021-01-27 16:57:38 · 87 阅读 · 0 评论 -
C语言:memcmp()。
#include<stdio.h>int main(){ int arr1[] = { 1,2,3,4,5 }; int arr2[] = { 1,2,5,4,3 }; int ret = memcmp(arr1, arr2, 9); //arr1和arr2比较前九个字节。 //arr1>arr2 return 大于0的数; //arr1=arr2 return 0; //arr1<arr2 return 小于0的数; printf("%原创 2021-01-27 16:43:21 · 220 阅读 · 0 评论 -
C语言:memmove()。
void * memmove ( void * destination, const void * source, size_t num )1、和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。2、如果源空间和目标空间出现重叠,就得使用memmove函数处理。在这里插入代码片...原创 2021-01-27 15:45:55 · 223 阅读 · 0 评论 -
C语言:memcpy()函数。
void * memcpy ( void * destination, const void * source, size_t num )1、函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。2、这个函数在遇到 ‘\0’ 的时候并不会停下来。3、如果source和destination有任何的重叠,复制的结果都是未定义的#include<stdio.h>//用法:struct S{ char name[20]; int age原创 2021-01-27 15:25:02 · 408 阅读 · 0 评论 -
C语言:字符转换函数。
#include<stdio.h>int main(){ int i = 0; char arr[] = "I Am A Student "; while (arr[i]) { if (isupper(arr[i]))//如果是大写字符,就转为小写字符。 { arr[i] = tolower(arr[i]); } i++; } printf("%s\n", arr); return 0;}...原创 2021-01-27 14:53:20 · 273 阅读 · 0 评论 -
C语言:strerror函数。
char * strerror ( int errnum );返回错误码,所对应的错误信息。#include<stdio.h>#include<errno.h>#include<string.h>int main(){ FILE* pf = fopen("text.txt", "r");//在创建的工程中,只读text.txt文件。 if (pf==NULL)//读取失败 { printf("%s\n", strerror(errno));//打印原创 2021-01-27 14:43:48 · 549 阅读 · 0 评论 -
C语言:strtok()的用法。
char * strtok ( char * str, const char * sep )1、sep参数是个字符串,定义了用作分隔符的字符集合;2、第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。3、strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)4、strtok函数的第一个参数不为 NULL原创 2021-01-26 20:04:51 · 2071 阅读 · 1 评论 -
C语言:strstr()的用法。
char * strstr ( const char *, const char * )#include<stdio.h>int main(){ char* p1 = "asdfgdfgasd"; char* p2 = "dfg"; char* ret = strstr(p1, p2);//返回第一次存在的子串的首地址。 if (ret==NULL) { printf("子串不存在。"); } else { printf("%s\n", ret); } ret原创 2021-01-26 13:56:49 · 370 阅读 · 0 评论 -
C语言:指针求字符串长度。
int mystrlen(char* str){ int len = 0; while (*str!='\0') { len++; str++; } return len;}原创 2021-01-25 20:55:21 · 1224 阅读 · 0 评论 -
C语言:字符串追加。
char * strcat ( char * destination, const char * source );1、源字符串必须以 ‘\0’ 结束。2、目标空间必须有足够的大,能容纳下源字符串的内容。3、目标空间必须可修改。4、字符串不能自己给自己追加#include<assert.h>char* mystrcat(char* dest, const char* src){ assert(dest); assert(src); char* ret = dest; //1原创 2021-01-25 20:47:17 · 6642 阅读 · 0 评论 -
C语言:字符串拷贝。
#include<string.h>char* strcpy(char * destination, const char * source );1、源字符串必须以 ‘\0’ 结束。2、会将源字符串中的 ‘\0’ 拷贝到目标空间。3、目标空间必须可变。destination不能为arr[]="asdfasf"或者为char* p=“adfasd”arr[]和p都不可变。4、目标空间必须足够大,以确保能存放源字符串。//模拟实现字符串拷贝#include<assert.h&原创 2021-01-25 20:40:29 · 1566 阅读 · 1 评论 -
C语言:求字符串长度。
#include<assert.h>char* mystrcpy(char* dest, char* src){ assert(dest); assert(src); char* ret = dest; //拷贝src指向的字符串到dest指向的空间,包含'\0' while (*dest++=*src++) { ; } //返回字符串的首地址。 return ret;}...原创 2021-01-25 20:28:37 · 219 阅读 · 0 评论 -
C语言:计数器实现求字符串长度。
#include<stdio.h>#include<assert.h>int mystrlen(char* str){ int count = 0; assert(str != NULL); while (*str!='\0') { count++; str++; } return count;}int main(){ char arr[] = "adsfsd"; int len = mystrlen(arr); printf("%d\n", l原创 2021-01-25 20:21:32 · 268 阅读 · 0 评论 -
C语言:杨氏矩阵查找元素。
#include<stdio.h>//杨氏矩阵:行和列都递增。例如://1 2 3 1 2 3//2 3 4 和 4 5 6//3 4 5 7 8 9// 在 1 2 3 中 查找7,将7和矩阵中右上角元素比较。// 4 5 6// 7 8 9//若右上角元素>7,排除右上角元素所在的 一列。//若右上角元素<7,排除右上角元素所在的 一行。//直到找到元素,或者矩阵为空。int findnum(int原创 2021-01-23 16:51:58 · 157 阅读 · 0 评论