c语言学习过程总结,C语言学习记录总结
一、C语言
【
1、C标准库
{
C 语言是一种广泛使用的、基于函数的编程范式的计算机程序设计语言。1972年时,在贝尔电话实验室工作的丹尼斯·里奇被创造出了用于移植与扩展UNIX的操作系统。
#include
---:引入了一个名为 assert 的宏,该宏用于检查程序所做的假设,并在假设不成立时输出诊断信息。
---:提供了一些函数,可用于测试和映射字符。
---:声明了一个整数字段 named errno,并由系统提供的接口来设置其值。在错误事件中的一些特定库函数指出了问题所在。
---:文件包含了一组与浮点值相关的依赖于平台的常量。
---:该规范规定了各类程序中各数据类型的特性。这些宏则限定不同数据类型的取值范围(例如整数值通常不超过某个阈限)。
该文件指定了特定地区的格式设置(例如日期格式以及货币符号)。随后我们将阐述一些宏及其一个关键的结构struct lconv和两个核心的功能。
---:该库定义了多种数学功能以及一个宏定义。在此库中所有可用的功能项均接受double类型参数,并均返回double类型的结果。
---:文件包含一系列的宏和长版本函数(如setjmp()和longjmp()),以及一种名为jmp_buf的特殊数据类型。这种数据类型的实现旨在使其能够绕过常规的程序流程控制。
---:文件声明了变量类型 sig_atomic_t,并有两个函数调用与一些宏被用来处理程序执行期间的各种信号。
---:该存储结构提供了变量类型va_list以及三个相关的宏定义;当函数的参数数量不可预知时(即实际输入与预期不同),这些宏将被用来解析函数所需的输入参数。
---:该文档规定了不同种类的数据类型与常量。这些数据类型的多数部分也可在其他包含头信息的文件中找到。
---:文件定义了三个变量类型、一些宏和各种函数来执行输入和输出。
---:文件定义了四个变量类型、一些宏和各种通用工具函数。
---:文件定义了一个变量类型、一个宏和各种操作字符数组的函数。
---:文件定义了四个变量类型、两个宏和各种操作日期和时间的函数。
}
2、基础理论知识
{
---程序结构:预处理器指令、函数、变量、语句&表达式、注释。 return 0; ---退出main()函数。
其中包含了自定义类型的标识符以及各种关键字如自定义类型、缺省值、长整型、分支结构、结束执行、枚举类型等,并使用寄存器修饰符来限制内存空间以提高运行效率;此外还包括通过类型定义指令来创建新的数据成员和成员函数的基础容器类型;其中还包含了用于实现重复执行的一组语句的基本语法构造之一以及用于表示分支中的情况等基本语法元素;通过使用外部声明来确保代码可维护性和可重用性;并且通过返回函数值来传递数据信息;还包含联合体及其相关的操作特性以及单字节的数据成员和双字节的操作特性等基础数据元素
---数据类型:
@1:基本类型
@2:枚举类型
@3:Void类型
@4:派生类型
标识符:在类型系统中被指定为variable_list类型的标识符。在外部存储空间中对整型变量i进行声明。注释部分指定整型全局变量i。--除非使用了extern关键字,在这种情况下标识符被视为全局类型的名称。
---常量:字符常量
\v--垂直分节符 \ooo--表示一到三位的八进数值 \xhh--表示一个或多个数字的十六进数值>
定义常量:@1:使用 #define 预处理器
@2:使用 const 关键字。
---存储机制:描述变量和函数大小、可访问程度以及存在时间。这些说明符用于修饰变量和函数,并位于其前面。
@1auto:属于所有局部变量默认的存储类。因此,在使用时它也只能作为函数内部的操作符,并且仅修饰局部变量。
@2register:该指令用于定义局部变量而非常规RAM中的存储空间。这表明变量的最大尺寸受限于寄存器容量(通常为一个机器字),并且无法对其施用一元运算符&(因为寄存器不具备内存地址)。只有在需要快速访问的情况下才会使用寄存器作为存储位置(例如计数器)。需要注意的是...定义 register 并不意味着该变量将被存储于寄存器中...它意味着该变量可能存储于寄存器中这一情况取决于硬件配置和软件实现的具体限制
@3static:指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。 static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。 static 是全局变量的默认存储类,以下两个变量
(count 和 road) 都有一个 static 存储类。
@4 extern:@4 extern 是一种存储机制,在C语言中用于为外部库提供接口实现而生成可移植代码时使用的一种方式。@4 extern 语句允许在包含外部实现的源代码中显式地引入外部函数或数据类型,并通过指定接口参数的方式连接外部实现与内部实现。@4 extern 修饰符通常被用来解决模块化开发中的接口兼容性问题,在实际应用中常用于多个模块之间共享相同接口以确保功能的一致性和互操作性
(auto 是局部变量的默认存储类, 限定变量只能在函数内部使用;
register 代表了寄存器变量,不在内存中使用;
static是全局变量的默认存储类,表示变量在程序生命周期内可见;
extern用于声明全局变量的意思是它对程序内所有文件都可见。这与Java中的\texttt{public}关键字作用相似。
--- 运算符号列表:{ 算术运算是指两个或多个数之间进行加减乘除等基本数学操作;关系运算是用于比较两个操作数的大小或判断它们之间的关系;逻辑运算是处理布尔值(真/假)的逻辑操作;位运算是作用于二进制数据的每一位的二进制操作;赋值运算是将一个值赋给变量或表达式;杂项运算是指除上述基本类别之外的其他特殊操作}
@1:逻辑运算符--&&、||、!
@2:位运算符--&(与)、|、^、>>、<<
@3:杂项运算符--sizeof()、&、*、?:
}
--循环:while 循环、for 循环、do...while 循环、嵌套循环{
@1:循环控制语句:break 语句、continue 语句、goto 语句
@2:无限循环---for( ; ; )
}
--函数:返回类型、函数名称、参数、函数主体
--作用域规则:{ 局部变量、全局变量和形式参数
@1:局部变量的值会覆盖全局变量的值。
@2:如果一个局部变量在未显式进行赋值的情况下,默认情况下不需要进行赋值操作;而当一个全局变量被定义时,默认情况下由系统负责处理赋值步骤。
}
--数组:存储一个固定大小的相同类型元素的顺序集合。
--指针{--代表另一个变量内存位置的变量;它所存储的是该对象在内存中的实际存储地址;这相当于直接引用了该对象在整个计算机系统中的物理存放位置。与常规数据类型相同,在尝试通过指针获取其他对象的内存地址时需要先进行声明
任何一个变量都拥有一个独特的内存位置,并且每个内存位置都被赋予了允许使用连号运算符访问其地址的能力
@1使用指针: int ip; / 指针变量的声明 / ip = &var; / 在指针变量中存储 var 的地址 */
printf("Address stored in ip variable: %p\n", ip ); /* 在指针变量中存储的地址 */
printf("Value of *ip variable: %d\n", ip ); / 使用指针访问值 */
@2空指针通常指的是赋值给NULL变量的指针。 NULL 指针是指在标准库中定义的一个变量 值为零 的常量。 程序规定不允许访问内存地址 0 因此 这些内存地址属于操作系统保留区域 所以 在大多数情况下 需要做非空判断以避免潜在的问题和错误行为。
}
--函数指针和回调函数{
@1:函数指针是用于指向特定功能程序的数据类型变量名,在C/C++编程语言中被广泛采用以实现动态绑定等高级功能特性。
其作用类似于传统意义上的普通函数标识符,在程序运行时可被当作普通变量引用并执行相应的操作。
在具体实现层面,则需遵循预先定义好的接口规范对相关功能进行配置设置。
数学公式int \,(*fun\_ptr)(int,int)表示一种指向同样参数、返回值的函数指针类型。
注释说明:// 该标识符定义了一个名为fun_ptr并具有特定参数及返回值类型的指针变量
实例: /* p 是函数指针 / int ( p)(int, int) = & max; // &可以省略
/* 与直接调用函数等价,d = max(max(a, b), c) */ d = p(p(a, b), c);
@2号:回调函数是指通过将一个具有返回值的数据类型的目标地址(即指向相应数据类型的指针)传递给另一个目标地址的能力而实现的功能接口。简而言之,在编程中如果有一个目标模块需要在其他模块运行时被触发或调用,则可以通过定义一个特定入口来实现这一功能,并将其返回值存储在相应的数据类型变量中以便后续处理。这种机制通常用于事件处理或其他需要动态响应的任务。
// 函数声明:
无返回类型的调用子程序 populates 指向整型数组的指针,并接收大小_t类型的数组大小及动态指向针 next value.
{
}
}
--字符串{
在 C 语言中,字符串实际上是用 null 字符 '\0' 终止的一维字符数组。被定义为用 null 字符终止的一维字符数组的一个字符串包含有其组成的各个字符。有关该操作函数的信息如下:
}
--结构体{
@1 定义:C 数组支持存储相同类型的多个数据项,在C编程中提供了一种用户自定义数据类型的选择。构成这一概念的是另一种功能强大的自定义数据类型系统。它能够存储不同类型的多个数据项,并通过 ... 标识符实现复杂的内存管理功能。使用 ... 语句创建了一个包含多个成员的新数据类型结构体。
@2访问结构成员:使用成员访问运算符(.)。
struct Books{ char title[50]; char author[50]; char subject[100]; int book_id; };
struct Books Book1; /* 声明 Book1,类型为 Books */
/* Book1 详述 */ strcpy( Book1.title, "C Programming"); Book1.book_id = 6495407;
/* 输出 Book1 信息 */ printf( "Book 1 title : %s\n", Book1.title);
@3结构在函数调用中被引用: /* 函数声明 */ void performOperation(int operand1, int operand2); 执行运算操作。
@4 指向结构的指针:为该结构体创建一个指针变量的方式类似于为其他数据类型创建类似——例如, 类似地, struct Books *struct_pointer;
指针变量中存储结构变量的地址:struct_pointer = &Book1;
通过指向该结构的指针来访问其成员时,请确保正确地运用->运算符;具体操作如下:struct_pointer->title;
实例: /* 函数声明 */ void printBook( struct Books *book );
struct Books Book1; /* 声明 Book1,类型为 Books */
/* 通过传 Book1 的地址来输出 Book1 信息 */ printBook( &Book1 );
@5:位域
}
--共用体{
@1说明:共用体是一种特殊的数据显示结构,在同一内存区域中可实现多种不同变量类型的共享存储。该技术能够定义包含多个成员的数据结构,并规定每次只能为其中一个成员赋值以避免数据冲突。这种数据组织方式提供了通过共享内存实现高效管理的有效途径。
@2定义:该 union 语句遵循与定义结构类似的构造方法;该 union 语句引入了具有多个成员的新数据类型。
union Data{ int i; float f; char str[20]; } data;
通过union关键字定义了一个名为Data的结构体类型,并将其命名为data。该结构体包含三个字段:i和str。将数据成员i赋值为10,并使用strcpy函数将数据成员str字段的内容复制为'C Programming'字符串。随后调用printf函数输出'data.i : %d'格式化字符串,并将变量i的当前值作为填充项传递给此格式化字符串参数
}
--位域{ 如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量。
在第1部分中对位域进行定义。注解:该结构用于定义位域。该结构包含两个无符号整型字段:widthValidated和heightValidated。其中widthValidated占用一个字节(B),heightValidately同样占用一个字节。其状态码为status2。
C语言中的位域声明:struct{\ type\ [member\_name]\ :\ width\ ;}表示这些变量占用指定宽度的缩写形式称为位域。
}
--typedef{
您可以用关键字 typedef 来重新命名类型。例如以下代码段展示了如何给术语BYTE进行定义: $
注释如下:
\texttt{BYTE}\,b1,\,\texttt{BYTE}\,b2;
在C语言中使用typedef与#define作为别名定义指令。它们如同typedef一般使用,并且各自具备独特的功能特点
@1:typedef仅用于类型符号名称的定义,在C语言中具有特定的使用场景。而#define不仅可以作为类型别名的定义工具,还可以用于数值的别名设定。例如,在代码开发中, 您可将数值1明确地赋值给变量ONE, 这样一来, 在后续运算过程中会更加直观可靠。
@2:typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。
}
--输入 & 输出{
标准文件:
C 语言中的 I/O (输入/输出) 主要采用 printf() 和 scanf() 两个核心函数来完成数据的接收与发送操作。其中 scanf() 负责从标准输入(如键盘)捕获并格式化数据内容,而 printf() 则将处理后的信息传递至标准输出设备(如屏幕)。
@ 格式化数据形式: %d 格式化输出整数 %f 格式化输出浮点型数据
@ getchar() & putchar() 函数:
--int getchar(void) 该函数用于从屏幕处读取下一个可用的字符,并将其返回为一个整数。\n\n在同一时间段内,该函数仅能获取一个单独的字符。\n\n建议在程序中嵌入此方法以连续获取多个字符。
该函数负责将指定的字符发送到屏幕显示并返回其输入参数所代表的相同字符。该函数在同一个时间单位内仅能发送一次单一类型的可打印控制字符到标准屏幕设备(如终端窗口)中。您可以在循环内调用此方法从而实现在一个操作周期内向标准屏幕设备发送多个不同的可打印控制字符。
@ gets() & puts() 函数:
--char *gets(char *s)函数会接收输入的一行至所指定的缓冲区域,并在遇到一个终止字符或结束标志时停止。
int puts(const char *s)会将字符串s及其后跟的一个换行符输出至stdout。
@ scanf() 和 printf() 函数:
--int scanf(const char *format, ...) 是一个特定的函数用于从标准输入流 std Read获取输入数据。
--int printf(const char *format, ...) 该函数将输出注入到标准输出流 std::stdout 中,并按照所给定的格式生成相应的输出内容。
Markdown格式说明支持 %s、%d、%c、%f 等多种数据类型的存储与显示方式,并且您还可以根据需求选择 ... 等其他格式类型
}
--文件读写{
通过调用 fopen( ) 函数来实现创建或打开文件的操作,并初始化 FILE 类型的一个实例对象。该操作会生成一个指向该文件的指针变量,并且在随后的过程中提供对该流的控制能力。
函数声明为:
FILE fopen( const char filename, const char* mode );
其中,
- filename 表示待操作的文件名称;
- mode 用于指定对所指涉文件的操作方式。
@ 2 退出文件 -- ;请通过调用 fclose( ) 函数来实现文件退出操作。函数的原型如下:int fclose( FILE *fp );
@ 当文件被成功关闭时,fclose( )函数返回值为0;若在关闭文件过程中出现错误,则该函数返回值为EndOfFile标志。
@ 3、文件写入:字符被写入到流中的最基础操作由函数 int fputc( int c, FILE *fp ) 完成。该函数负责将参数 c 所表示的字符值传递给指向特定输出流的指针变量 fp 进行存储。若操作成功无误,则该函数将返回所存储的字符信息;若发生任何异常情况,则返回 EOF 值。
int fputs(const char* s, FILE* fp);
该函数用于将由字符数组s所代表的内容输出至文件描述符fp所指定的输出流中。若无任何错误发生,则该函数将返回一个大于等于零的整数值;否则,在出现错误的情况下,该函数将返回EOF值。
第4节、文件读取
@5、二进制输入输出子程序:fread(指针变量, 数据大小, 元素数目, 文件指针);
说明
}
--预处理器{
@1 定义:C预处理器并非编译器的一个组成部分,在程序开发流程中扮演着独立的角色。然而,在编译过程中它被视为一个独立的过程。简单来说,C预处理器仅仅是负责进行文本替换的一个工具,它们负责指导编译器在实际生成代码前执行必要的预处理工作,我们将这种预处理过程简化表示为CPP.
所有预处理指令均应起始使用井号符号#。该符号作为第一个非空字符至关重要,在文档排版中占据首位位置显得尤为重要。为提升易读性标准, 所有预处理指令需安排在第一列位置, 以便于信息浏览和理解
#include 包含一个源代码文件
#undef 取消已定义的宏
#ifdef 如果宏已经定义,则返回真
#ifndef 如果宏没有定义,则返回真
#if 如果给定条件为真,则编译下面代码
#else #if 的替代方案
#elif 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码
#endif 结束一个 #if……#else 条件编译块
#error 当遇到标准错误时,输出错误消息
#pragma 使用标准化方法,向编译器发布特殊的命令到编译器中
@2、预处理器实例:
<
--#define MAX_ARRAY_LENGTH 20 宏定义
--#include 引进系统文件
--#include "myheader.h" 引进本地文件
--#undef FILE_SIZE 取消宏定义
--#define FILE_SIZE 42 重新定义宏
只有当未定义时(即#ifndef MESSAGE),才重新定义MESSAGE为'You wish!'(即#define MESSAGE 'You wish!')。
--#ifdef DEBUG /* Your debugging statements here */ #endif 判断如果定义了,执行。。
@3、预定义宏:
<
DATE 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。
TIME 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。
FILE 这会包含当前文件名,一个字符串常量。
LINE 这会包含当前行号,一个十进制常量。
STDC 当编译器以 ANSI 标准编译时,则定义为 1。
@4、预处理器运算符
<
宏延续运算符(\):一个宏通常可以编写在一个单独的行中。然而,在某些情况下,当一个宏过于冗长以至于无法在一个单独的行中完整呈现,则需要使用宏延续运算符(\)进行分段处理。例如:这个方法适用于多种复杂场景。
#define message_for(a, b) \
printf(#a " and " #b ": We love you!\n")
在程序设计中,在定义包含字符串操作的宏时,则需采用字符串常量化运算符(#[)来实现将一个宏变量转换为相应的字符型数据。这种情况下,在程序运行过程中可确保所引用的数据类型与实际操作对象的一致性。具体而言,在C/C++编程语言中通常会按照如下方式定义此类问题中的相关变量:#include
==调用: message_for(Carole, Debra);
--标记粘贴运算符(##):在宏内提供的标记粘贴运算符(##)可将两个参数连接起来形成一个整体。该运算符使得在宏定义中两个独立的标记能够被连接为一个单一的标记。例如:
#define tokenpaster(n) (token" #n " = %d)
tokenpaster(34);
--defined() 运算符:
}
}
--头文件{
@1、包含文件:一种具有扩展名.h的特殊计算机文檔格式,在C/C++程式設計語言中被廣泛采用來 declares函數與macros並提供程式之間的信息共用與存取机制。
通常分为两种类型:一种是由程序员自行编写并遵循特定命名约定的标准库包含文檔(.h),另一种是编译器内置的标准库包含文檔(.h)。为了在程序中引用这些包含内容,请使用预处理指令#include。
为了提高代码管理效率和可维护性,在编写程序时应尽量将所有常量、宏定义、系统全局变量及函数原型统一放置在一个或多个包含文檔(.h)中。
@2、引入头文件的方法:通过预处理指令 include 可以调用用户和系统头文件。有两种主要的形式:include 这种形式用于引入系统头文件。它会按标准路径查找名为 file 的目标文件。当编译源代码时,请通过 -I 选项将该目录置于前面的标准路径之前。
=#include "file" 这种形式被用来引用用户自定义的头文件。这种机制允许程序通过链接器找到并包括指定位置的外部库或自定义模块。当编译源代码时,请通过-I 选项将路径参数放在列表之前。
仅在源代码中包含一次标准库头文件。若同一个包含命令被执行两次(即同一个包含操作在源代码中出现两次),则会导致编译器解析该包含指令两次从而引发错误。为了避免这种现象的发生,在标准做法中建议将整个代码内容通过条件编译语句进行集中管理
#ifndef HEADER_FILE
#define HEADER_FILE
the entire header file file
#endif
@4、有条件引用:有时需要从多个不同的包含头文件中选择一个用于程序引用。比如,在不同操作系统上使用时需指定相应的配置参数。您可以通过一系列的条件判断来实现这一目标。
#if SYSTEM_1
include "system_1.h"
#elif SYSTEM_2
include "system_2.h"
#elif SYSTEM_3
...
#endif
}
--强制类型转换{
@1、
强制类型转换:
强制类型转换是指将变量从一种数据类型的格式(如浮点数)转为另一种数据类型的格式(如整数):
即通过将变量指定为另一种数据类型的指定形式来进行强制转化。
具体而言,则是将高精度的数据格式转化为低精度的形式。
type_name expression
@2、整数提升:该方法涉及将数值范围低于int或unsigned int的数据类型转换为int或unsigned int的方式。其中变量c被赋值为字符'c'(ASCII值对应于99)。
@3、常用的算数转换:常规的算术转换是隐式地将数值强制转换为相同的数据类型。在处理具有不同数据类型的运算时, 编译器首先执行整数提升操作。这些常见的算术操作不适合用于赋值、逻辑与(&&)和逻辑或(||)运算。
}
--错误处理{
@1、错误处理:C语言本身缺乏直接处理错误的能力;然而作为一门广泛应用于系统级编程的语言;它通过返回值的形式暴露了底层数据;当遇到异常情况时;大多数情况下会在函数调用中返回标志值 1 或者 NULL;并为这些异常情况设置了相应的出错位 flag 等;这些出错位 flag 的定义可以在相应的头文件中找到详细说明;它们能够准确反映函数执行过程中的故障状态。
=C 程序员可以通过查看返回值来选择相应的处理方式。开发人员应在程序初始化时将...设为...作为正确的编程做法。一个数值代表无错误的状态。
@2、这些函数用于处理与 errno 相关的信息:它们是 C 语言中用于呈现错误信息的关键函数。
=perror() 该函数会返回输入字符串,并随后输出一个冒号和一个空格以及当前 errno 值的呈现方式。
=strerror() 函数,返回一个指针,指针指向当前 errno 值的文本表示形式。
@3、被零除的错误:当执行除法运算时若不检查除数是否为零将会引发一个运行时错误为了避免这种情况发生该代码会在执行除法运算之前先检查除数是否为零
if( divisor == 0){
fprintf(stderr, "除数为 0 退出运行...\n");
exit(-1);
}
在处理@4相关内容时,在大多数编程环境中,默认情况下@4将被赋值给exit_status变量以指示正常的执行完毕状态;然而,在某些特殊场景下此变量会被赋予其他特定数值以反映不同的执行结果;例如,在大多数编程环境中,默认情况下@4将被赋值给exit_status变量以指示正常的执行完毕状态;然而,在某些特殊场景下此变量会被赋予其他特定数值以反映不同的执行结果;例如,在大多数编程环境中,默认情况下@4将被赋值给exit_status变量以指示正常的执行完毕状态;然而,在某些特殊场景下此变量会被赋予其他特定数值以反映不同的执行结果;例如,在大多数编程环境中,默认情况下@4将被赋值给exit_status变量以指示正常的执行完毕状态;然而,在某些特殊场景下此变量会被赋予其他特定数值以反映不同的执行结果
if( divisor == 0){
fprintf(stderr, "除数为 0 退出运行...\n");
exit(EXIT_FAILURE);
}
}
--递归{
@1、递归:recursion是一种通过函数自身实现重复操作的方法。它依赖于满足特定条件时的终止条件来避免无限循环。其一般形式表现为一个函数在其体内直接或间接地调用自身,并在适当的时候终止这种过程。
具体而言,在C语言中:
int factorial(int n) {
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
int main() {
int n = 5;
printf("Factorial of %d is %d\n", n, factorial(n));
return 0;
}
递归函数在应对多种数学问题时发挥着举足轻重的作用,在诸如计算一个整数n的阶乘以及构建斐波那契数列等情况下表现尤为突出。
@2、数的阶乘:
#include
double factorial(unsigned int i)
{
if(i <= 1)
{
return 1;
}
return i * factorial(i - 1);
}
int main()
{
int i = 15;
printf("%d 的阶乘为 %f\n", i, factorial(i));
return 0;
}
@3、斐波那契数列:
}
--可变参数{
希望实现能够处理任意数量输入的目标而非预先设定固定的输入个数。C语言为此提供了一种解决方案,在此方案下您能够创建一个函数来根据具体需求接收任意多的数量作为输入。以下实例展示了这种功能的具体实现。
int func(int, ... )
{
.
.
.
}
int main()
{
func(1, 2, 3);
func(1, 2, 3, 4);
}
在函数 func() 中,默认末尾的那个参数被标记为省略号(如三个点号...)。该标记前面的那个整型变量用于指示将传递给该函数的有效可变数量。若要利用这一特性,请确保包含 stdarg.h 头文件。
}
--内存管理{
@1内存管理领域:C 语言提供了多种用于内存分配与管理的函数。具体来说,这些功能通常位于标准库中的特定头文件中。
使用函数 calloc 动态获取内存块。
该函数的作用是在内存中动态获取连续的空间块,并且能够为这些空间块中的每一个单元(即每个字节)初始化为零值。
空类型deallocate函数名为free(空型参数地址),用于回收指向一段连续动态内存的一指针变量。
= malloc(void *, int num); // 用于从堆区动态获取所需内存空间的过程
// 在调用此函数后会返回一个有效指针
// 如果返回值为NULL,则表示无法动态分配足够的内存
// 函数参数num指定所需的字节数
// 需要注意的是
// 存储于这些地址中的数据其初始状态不可知
// 并且这些地址在其未被赋值前具有任意值
= void* realloc(void* address, int newsize); -- 此函数用于实现动态内存分配。
它负责将容量扩大为指定的新大小。
@2、动态分配内存:编写程序时,在确定变量类型之前预先为变量分配存储空间是一种常用方法。比如,在C语言中常使用的方式是 char name[100];
但是,在缺乏对所需存储文本长度预估的情况下(例如,在您需向"存储"部门提供一个详细描述关于某个主题的内容时),我们通常会先创建并赋值指向未预先定义内存空间位置的一个指针(如"p"),随后根据具体需求动态申请所需内存空间(如"p = (char*)malloc(200)")。此外,在某些情况下(如当预先确定好所需数组大小后),我们可以直接替换调用函数以达到相同效果(如将malloc替换为calloc)。需要注意的是,在动态内存管理中掌握灵活度非常重要——它允许我们在运行时传递任意大小的数据块;然而这也带来了一定的风险——一旦预先指定数组大小就无法更改这一属性。
@3、重新配置内存容量并释放记忆空间:当程序退出后,系统会自动回收已分配的所有内存量.建议在不再需要内存量时,都应该调用free函数来释放记忆空间.也可以使用realloc函数动态地增减现有分配的内存量.我们应结合realloc和free函数进行操作,再次查看上面的例子: /* 使用free函数释放内存量*/ free(description);
}
--命令行参数{
第1点:在运行程序时,可以通过输入数值向C语言程序传递数据.这些数值被称为命令行参数,它们对于程序而言具有重要意义;尤其是当希望从外部进行控制而不是在代码内部进行硬编码赋值时显得尤为关键.
}
-- 标准库 - {
@1、简介:C 标准库中的assert.h 头文件引入了名为assert的功能模块。该功能模块可用于检测程序运行中的错误假设,并在错误发生时发送相应的错误信息。已被预先定义好的assert 命令指向另一个常量NDEBUG。需要注意的是,在某些情况下此常量已经被重新定义过,请参考下面关于assert命令的具体实现。
第@2部分、库宏:assert函数...其实它并不是一个普通的函数而是另一个辅助工具,在C程序中用于对代码进行调试与排查错误。
}
-- 标准库 - {
@1、简介:C 标准库中的 ctype.h 头文件提供了大量用于分类和处理字符的功能 =这些函数均接受整数值作为输入参数 =其值必须是 EOF 或者表示为一个合法的无符号字符 =当参数 c 满足上述条件时 =这些函数将返回非零值(true);否则将返回零
@2、
}
--标准库 - {
@1、简介:C 标准库中定义于 ctype.h 头文件中的若干相关函数用于对字符进行测试与映射操作。
=每个函数都接收一个整数值作为输入。
=其数值必须等于 EOF 或者对应于一个无符号字符。
当参数 c 符合上述条件时(即当参数 c 的值等于 EOF 或者对应于一个无符号字符时),相关函数将返回非零值(true)。
否则情况下(即当参数 c 不满足上述条件时),相关函数将返回零。
@2、库函数:
=int isalnum(int c)----该函数检查所传的字符是否是字母和数字。
=int isalpha(int c)-----该函数检查所传的字符是否是字母。
=int iscntrl(int c)------该函数检查所传的字符是否是控制字符。
=int isdigit(int c)------该函数检查所传的字符是否是十进制数字。
=int isgraph(int c)-----该函数检查所传的字符是否有图形表示法。
=int islower(int c)-----该函数检查所传的字符是否是小写字母。
=int isprint(int c)------该函数检查所传的字符是否是可打印的。
=int ispunct(int c)-----该函数检查所传的字符是否是标点符号字符。
=int isspace(int c)-----该函数检查所传的字符是否是空白字符。
=int isupper(int c)-----该函数检查所传的字符是否是大写字母。
=int isxdigit(int c)-----该函数检查所传的字符是否是十六进制数字。
=int tolower(int c)-----该函数把大写字母转换为小写字母。
=int toupper(int c)----该函数把小写字母转换为大写字母。
@3、字符类:
=数字
=十六进制数字
=小写字母
=大写字母
=字母
=字母数字字符
=标点符字符
=图像字符
=空格字符
=可打印字符
=控制字符
=空白字符
=字母字符
}
--标准库 - {
@1、简介:C标准库中的 errno.h 头文件声明了一个名为 errno 的整数变量,默认情况下设定了 zero 值,并可在发生错误时由某些系统调用将其修改以指示具体出错情况。
它是在系统调用中被设置的,并且在发生错误时会根据具体情况返回相应的状态码。
为了方便操作,在程序运行过程中我们通常会将 errno 作为一个可变且具有整数值类型的左侧表达式来使用。
此外,在适当的时候我们还可以直接修改 errno 的值或者将其重置回初始状态 zero。
而这些用于标识不同错误类型的常量则应表示为整型常量表达式。
@2、库宏:
=extern int errno-----这是一个在C程序中定义的外部整型全局变量,在处理错误事件时被赋值为特定值的标识符;它通常用于在发生错误时通过检查相应的库函数来确定具体发生了什么类型的错误。
=EDOM Domain Error----该宏标识一个域错误,在输入参数超出相应数学函数定义域时发生。常见于计算结果超出范围的情况;此时会将errno变量设置为EDOM。
=ERANGE Range error——errn.这个宏表示一个范围错误,当输入参数超出数学函数定义的范围时会触发error n.
}
--标准库 - {
@1、简介:...头文件包含了一系列与浮点运算相关的平台依赖常量。这些平台依赖常量由ANSI C标准定义以确保程序的可移植性。为了更好地理解这些平台依赖项,请先明确浮点数由哪四部分构成。
=S 符号 ( +/- )
=b 指数表示的基数,2 表示二进制,10 表示十进制,16 表示十六进制,等等...
=e 指数,一个介于最小值 emin 和最大值 emax 之间的整数。
=p 精度,基数 b 的有效位数
}
--标准库 - {
@1、简介:包含于 limits.h 头文件的各种变量类型都具有相应的属性设定。该头文件中的宏定义限定了诸如 char、int 和 long 等变量类型的取值范围。=这些约束条件确保了变量无法存储超出指定范围的数值,请注意无符号类型的最大数值为255。
@2、库宏:
=CHAR_BIT 8 定义一个字节的比特数。
=SCHAR_MIN -128 定义一个有符号字符的最小值。
=SCHAR_MAX 127 定义一个有符号字符的最大值。
=UCHAR_MAX 255 定义一个无符号字符的最大值。
=CHAR_MIN 0 指定类型 char 的最小值属性初始化为零。若 char 类型表示为负数,则该属性将取该类型的最小整数值 SCHAR_MIN;否则其值设为零。
赋值字符类型的最大字符编码为127。
当字符类型char表示负数值时,则其数值等同于SCHAR_MAX。
反之则与其等同于UCHAR_MAX。
=MB_LEN_MAX 1 定义多字节字符中的最大字节数。
=SHRT_MIN -32768 定义一个短整型的最小值。
=SHRT_MAX +32767 定义一个短整型的最大值。
=USHRT_MAX 65535 定义一个无符号短整型的最大值。
=INT_MIN -32768 定义一个整型的最小值。
=INT_MAX +32767 定义一个整型的最大值。
=UINT_MAX 65535 定义一个无符号整型的最大值。
=LONG_MIN -2147483648 定义一个长整型的最小值。
=LONG_MAX +2147483647 定义一个长整型的最大值。
=ULONG_MAX 4294967295 定义一个无符号长整型的最大值。
}
--标准库 - {
@1节 简述:locale.h 头文件编码了特定地域的信息。例如,在此头文件中可以找到关于日期格式与货币符号等的具体编码规则。
随后我们将阐述一些宏(包括但不限于预处理器指令),并详细解析一个关键的数据结构(struct lconv)与若干重要函数。
@2、库宏:
=LC_ALL----设置下面的所有选项。
=LC_COLLATE-----影响 strcoll 和 strxfrm 函数。
=LC_CTYPE-----影响所有字符函数。
=LC_MONETARY--影响 localeconv 函数提供的货币信息。
=LC_NUMERIC---影响 localeconv 函数提供的小数点格式化和信息。
=LC_TIME------影响 strftime 函数。
@3、库函数:
=char *setlocale(int category, const char *locale)----设置或读取地域化信息。
=struct lconv *localeconv(void)------设置或读取地域化信息。
}
--标准库 - {
@1、简介:math.h 头文件定义了多种数学函数以及一个宏常数。在该包含(包含)中提供的所有功能均接受一个double类型的参数变量,并均返回一个double类型的结果变量。
@2、库宏:
HUGE\_VAL定义了当函数的结果超出浮点数所能表示范围的情况。
当运算结果超出数值范围时(即因为数值过大或过小),该函数将通过设定errno变量来报告溢出错误(即数值过大)或下溢错误(即数值过小),并根据具体情况返回相应的极值或零值。
在这些情况下, err变量可能会被设定为ERANGE,也可能不会被设定为此值。
@3、库函数:
=double acos(double x)-----返回以弧度表示的 x 的反余弦。
=double asin(double x)-----返回以弧度表示的 x 的反正弦。
=double atan(double x)-----返回以弧度表示的 x 的反正切。
=double atan2(double y, double x)——计算以弧度为单位的y与x比例的反正切值。其中y和x的符号确定了结果所在的象限位置。
=double cos(double x)------返回弧度角 x 的余弦。
=double cosh(double x)-----返回 x 的双曲余弦。
=double sin(double x)------返回弧度角 x 的正弦。
=double sinh(double x)-----返回 x 的双曲正弦。
=double tanh(double x)-----返回 x 的双曲正切。
=double exp(double x)------返回 e 的 x 次幂的值。
=double frexp(double x, int *exponent)-----该函数将浮点数 x 分离为尾数和幂次。该函数返回存储在 exponent 中的幂次。其结果为 x = mantissa * 2 ^ exponent.
=double ldexp(double x, int exponent)------返回 x 乘以 2 的 exponent 次幂。
=double log(double x)------返回 x 的自然对数(基数为 e 的对数)。
=double log10(double x)----返回 x 的常用对数(基数为 10 的对数)。
表示modf函数接收一个双精度浮点型变量x以及一个指向双精度变量*integer。其返回的小数值字段代表x的小数值字段,并完成取整操作至变量integer中。
=double pow(double x, double y)------------返回 x 的 y 次幂。
=double sqrt(double x)-----返回 x 的平方根。
=double ceil(double x)-----返回大于或等于 x 的最小的整数值。
=double fabs(double x)-----返回 x 的绝对值。
=double floor(double x)----返回小于或等于 x 的最大的整数值。
=double fmod(double x, double y)-----------返回 x 除以 y 的余数。
}
--标准库 - {
@1内容概述:头文件setjmp.h包含了宏setjump()、函数longjump()以及数据类型jmp_buf。
该数据类型的使用能够跳过常规的函数调用与返回流程。
@2、库变量:
=jmp_buf 这是一个专门用于存放与宏 setjmp() 以及函数 longjmp() 相关联的信息的数组数据类型。
@3、库宏:
= int setjmp(jmp_buf environment)----该宏负责管理环境变量environment的保存工作,并在longjmp函数内部使用。当此宏直接由外部调用时执行时返回的值为零;而若此宏是在longjmp函数内部被调用并返回时,则其返回值将为非零。
@4、库函数:
定义函数 longjmp 未带参变量类型
}
--标准库 - {
@1、简介:在signal.h 头文件中声明了一个变量类型sig_atomic_t,并提供了两个函数的调用接口以及相关的宏定义以处理程序运行过程中各种信号的响应。
@2、库变量:
= sig_atomic_t:这是一个整数类型,在信号处理程序中被当作一个变量引用。它表示一个对象的整数值,并且即使遇到异步信号的情况(即多个线程同时执行时),该对象仍可作为一个独立的整体进行访问。
@3、库宏:
=SIG_DFL----默认的信号处理程序。
=SIG_ERR----表示一个信号错误。
=SIG_IGN----忽视信号。
=SIGABRT----程序异常终止。
=SIGFPE-----算术运算出错,如除数为 0 或溢出。
=SIGILL-----非法函数映象,如非法指令。
=SIGINT-----中断信号,如 ctrl-C。
=SIGSEGV----非法访问存储器,如访问不存在的内存单元。
=SIGTERM----发送给本程序的终止请求信号。
@4、库函数:
此函数为处理信号而设置了一个专门的机制,在C编程中常用于管理事件驱动的应用
=int raise(int sig)-----该函数会促使生成信号 sig。sig 参数与 SIG 宏兼容。
}
--标准库 - {
@1、简介:包含va_list变量类型及其相关宏的头文件是stdarg.h。这些宏设计用于从函数中提取任意数量的参数。这些宏允许在调用函数时灵活地传递多个自变量值。通过省略号(..., )表示法,在函数末尾指定可变数量的参数。
@2、库变量:
:= va_list 是一种用于管理 va_start()、va_arg() 和 va_end() 这些宏存储信息的数据类型。
@3、库宏:
此函数用于初始化va_list类型的变量ap,并配合使用va_arg和va_end宏完成相关操作。该处需要同时引用这些辅助宏才能正常运行。其中,last_arg表示函数中最后一个已知的固定参数, 即位于省略号前的那个参数.
= typename va_args(va_list arr, typename T)-----这个宏用于检索函数参数列表中类型为typename T的下一个参数。
=void va_end(va_list ap)-----该宏允许使用带有可变参数的va_start宏的函数实现返回功能。若未调用va_end,则函数返回结果将无定义。
}
--标准库 - {
@1、简介:\require{enclose}\boxed{\texttt{std\_headers.h}} 定义了各种数据类型和预定义常量(宏)。其中绝大多数也可在其他相关头文件中找到。
@2、库变量:
=ptrdiff_t----这是有符号整数类型,它是两个指针相减的结果。
=size_t ------这是无符号整数类型,它是 sizeof 关键字的结果。
=wchar_t -----这是一个宽字符常量大小的整数类型。
@3、库宏:
=NULL-----这个宏是一个空指针常量的值。
该函数用于获取对象在内存中的位置相对于某个基点(如结构体)的偏移量。其结果是该结构成员相对于整个数据类型的起始位置所占用的空间数量。这些成员由 member-designator 标识。对应的类型标识符由 type 参数确定。
}
--标准库 - {
@1-1 概述:包含头文件 stdio.h 宣布了三种数据类型、一些预定义的常量或宏以及一系列函数用于完成输入与输出的操作。
@2、库变量:
=size_t ----这是无符号整数类型,它是 sizeof 关键字的结果。
=FILE ------这是一个适合存储文件流信息的对象类型。
=fpos_t ----这是一个适合存储文件中任何位置的对象类型。
@3、库宏:
=NULL----这个宏是一个空指针常量的值。
_IOFBF、_IOLBF 和 _IONBF 这些宏名称表示具有特定数值的整型常量表达式,并且在 setvbuf 函数的第3个参数位置上使用。
=BUFSIZ----这个宏是一个整数,该整数代表了 setbuf 函数使用的缓冲区大小。
=EOF ------这个宏是一个表示已经到达文件结束的负整数。
:= FOPEN_MAX ---- 该宏名为一个整数值, 表示系统可同时打开的文件数量.
=FILENAME_MAX --该标识符被定义为表示一个整数值的变量。它代表了字符数组存储文件名的能力。如果实现没有限制,则建议设置其最大容量为标准值。
=L_tmpnam ------这个变量是一个整数。它表示字符数组能够存储由 tmpnam 函数生成的临时文件名的最大长度。
=SEEK CUR、SEEK END 和 SEEK SET --- 这些宏变量是在 ... 函数内部使用,在一个文件中定位不同位置的不同标志符。
=TMP_MAX -------这个宏是 tmpnam 函数可生成的独特文件名的最大数量。
等于 stderror, stdin 和 stdout 的这些都是指向 FILE 类型的对象, 分别代表标准错误. 标准输入和标准输出流.
@4、库函数:
=int fclose(FILE *stream)------关闭流 stream。刷新所有的缓冲区。
=void clearerr(FILE *stream)---清除给定流 stream 的文件结束和错误标识符。
=int feof(FILE *stream)--------测试给定流 stream 的文件结束标识符。
=int ferror(FILE *stream)------测试给定流 stream 的错误标识符。
=int fflush(FILE *stream)------刷新流 stream 的输出缓冲区。
=int fgetpos(FILE *stream, fpos_t *pos)-----该函数用于计算流 stream 的当前位置,并将该位置值存储在 pos 指针中。
=FILE (const char filename, const char* mode)-----打开指定名称为 filename 的文件,并根据指定模式 mode 进行操作
=size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream)——从指定文件流 stream 读取指定大小的数据块到目标数组中。
=FILE *freopen(const char *filename, const char *mode, FILE *stream)-----创建一个指针变量并将其指向新生成的由该函数返回的新文件句柄
=int fseek(FILE *stream, long int offset, int whence)-----将文件 stream 的起始位置设置为指定的偏移量 offset,并通过whence参数确定需要查找的位置以获取所需移动的数量。其中 offset 表示从指定位置whence开始查找所需移动的字节数。
int fsetpos(FILE* stream, const fpos_t* pos)=0; 该函数将指定的流 stream 设置为目标位置值。\n\n其中参数 pos 由函数fgetpos确定其目标位置值。
=long int ftell(FILE *stream)---------返回给定流 stream 的当前文件位置。
=size_t fwrite(const(void*)ptr,size_t size,size_t nmemb(FILE*)stream)------用于将内存区域中的数据传递给指定文件流
=int remove(const char *filename)-------删除并禁用文件名 filename, 使其无法再被访问
= int rename(const char*old\_filename*, const char*new_filename*) ----- 将 old\_filename 指向的文件名重命名为 new\_filename.
=void rewind(FILE *stream)------设置文件位置为给定流 stream 的文件的开头。
=void setbuf(FILE *stream, char *buffer)------定义流 stream 应如何缓冲。
设置缓冲函数:int setvbuf(FILE* stream, char* buffer, int mode, size_t size)----- 另一个实现缓冲的方式是什么?
=FILE *tmpfile(void)-----以二进制更新模式(wb+)创建临时文件。
=char *tmpnam(char *str);注释分割线后为生成并返回一个有效的临时文件名;该文件名为首次生成。
=int fprintf(文件stream, const char format, ...)——将格式化输出发送至流 stream 中。
=int printf(const char *format, ...)------发送格式化输出到标准输出 stdout。
=int sprintf(char *str, const char *format, ...)-----发送格式化输出到字符串。
返回值类型为int的vfprintf函数用于接收三个参数:文件句柄stream、格式字符串format以及变长参数列表arg,并将这些参数用于向流stream发送格式化输出
=int vprintf(const char *format, va_list arg)-----通过va_list参数传递格式化的输出至标准输出端口stdout.
为int类型函数vsprintf(char *str, const char *format, va_list arg)---------通过参数列表实现格式化输出至字符串。
=int fscanf(FILE *stream, const char *format, ...)--------从流 stream 读取格式化输入。
=int scanf(const char *format, ...)------从标准输入 stdin 读取格式化输入。
=int sscanf(const char *str, const char *format, ...)-----从字符串读取格式化输入。
=int fgetC(FILE *stream);// 通过函数fgetC读取文件stream中的下一个字符(一个无符号字符),并相应地调整文件指针的位置。
=const char *const fgets(const char *buf, int count, const FILE *file)---------从指定文件 stream 中读取一行文本并将其存入由 str 指向的字符数组中。当累计读取 (count-1) 个字符时或遇到换行符时或达到文件末尾时会停止具体情况具体分析
=int fputc(int char, FILE *p),其中p为指向文件对象的指针。将指定的无符号字符char通过指针p传递给函数fputc进行输出操作,并按标准C程序设计规范实现字符输出到文件流中的功能。
此函数声明定义了一个名为fputs的函数,在C程序中用于将const char类型的字符串传递给指定的FILE类型的流变量stream,并返回一个int类型的值。
返回一个整数值的函数名,并读取指定文件句柄中的下一个可读字符;同时向前推进文件指针的位置标识符。
=int getchar(void)------从标准输入 stdin 获取一个字符(一个无符号字符)。
=char *gets(char *str)---从标准输入 stdin 获取一行字符数据,并将其存储在指定的字符串指针str中。该函数会在遇到回车键后或达到文件末尾时停止处理。
=int putc(int char, FILE *stream)------该函数负责将给定的无符号字符(由char参数确定)传递给文件流stream,并调整指针位置。
=int putchar(int char)-----实现将参数char指定为字符,并负责输出到标准输出流 std::cout 中。
=
int puts(const char *str)-----将该字符串发送至标准输出stdout,并在每行末尾添加换行符直至遇到空字符时停止处理。
=int ungetc(int char, FILE *stream)-------将无符号字符char压送到目标流stream中,并使其成为随后从该流中读取的数据内容。
void perror(const char *str) 负责将一个错误信息输出到标准错误 (stderr) 中。随后紧跟冒号。
}
--标准库 - {
@1、简介:stdlib .h 头文件定义了四个变量类型、一些宏和各种通用工具函数。
@2、库变量:
=size_t ----- 这是无符号整数类型,它是 sizeof 关键字的结果。
=wchar_t ----- 这是一个宽字符常量大小的整数类型。
=div_t ----- 这是 div 函数返回的结构。
=ldiv_t ----- 这是 ldiv 函数返回的结构。
@3、库宏:
=NULL ---- 这个宏是一个空指针常量的值。
=EXIT_FAILURE ----- 这是 exit 函数失败时要返回的值。
=EXIT_SUCCESS ----- 这是 exit 函数成功时要返回的值。
=RAND_MAX ----- 这个宏是 rand 函数返回的最大值。
=MB_CUR_MAX 该变量代表多字节字符集中允许的最大字符数量,并受 MB_LEN_MAX 的限制。
@4、库函数:
double atof(const char *str)---- 将输入字符串str转换为具有双精度类型的浮点数值,并使用变量double来存储结果。
=int atoi(const char *str) ---- 解析字符指针 str 所指向的字符串到整数值(类型 int)。
=long int atol(const char *str)-----将所指字符串转换为其对应的长整数值
=double strtod(const char *str, char **endptr) ------ 将输入参数 str 所包含的字符串解析为一个双精度浮点数值.
返回一个长整数值... strtol函数解析由字符串...所指的内容到指定的位置,并将其值解析为指定底数...long int类型的值
=unsigned long int strtoul(const char *str, char **endptr, int base) ----- 将指向字符串 str 的指针所指字符串内容转换为其对应的无符号长整数值(其数据类型为 unsigned long int)。
=void *calloc(size_t nitems, size_t size) 按需求分配指定数量的内存块,并返回这些内存块所占用的空间的起始地址。
此函数用于释放由calloc、malloc或realloc预先占用内存的空间。
=void *malloc(size_t size) ----- 分配所需的内存空间,并返回一个指向它的指针。
=void *realloc(void *ptr, size_t size) 旨在重新调整之前调用 malloc 或 calloc 所分配 ptr 所指向内存块的空间。
=void abort(void) ------ 使一个异常程序终止。
=int atexit(void (*func)(void)) ----- 当程序正常终止时,调用指定的函数 func。
=void exit(int status) ----- 使程序正常终止。
=char *getEnv(const char *name) ----- 获取与指定字符相关联的环境变量信息。
=int system(const char* string) ----- 该函数通过 const char* string 引用接收指定的命令序列。
=internal_bsearch<empty_t>(&key, &base, nitems, size,
[](const &a, const &b) { return compar(a,b); }) ---- 完成基于比较函数的二分查找操作。
无返回值qsort()用于对指针类型的内存块进行无间隙的有序排列(通过指定自定义比较函数)
=int abs(int x) ----- 返回 x 的绝对值。
=div_t div(int numer, int denom) ----- 分子除以分母。
=long int labs(long int x) ----- 返回 x 的绝对值。
=ldiv_t ldiv(long int numer, long int denom) ----- 分子除以分母。
=int rand(void) ----- 返回一个范围在 0 到 RAND_MAX 之间的伪随机数。
=void srand(unsigned int seed) ------ 此函数设置使用 rand 函数的随机数生成器的种子值
=int mblen(const char *str, size_t n) 该函数返回参数str所指的扩展ASCII字符的数量。
=size_t mbstowcs(schar_t *pwcs, const char *str, size_t n)-----实现将多字节字符的数据编码到目标数组中。
返回值为int类型的函数mbtowc接收三个参数:指针变量pwc、常字符指针变量str以及无符号整数n,并用于验证字符串str所指的多字节字符是否存在。
=size_t wcstombs(char *str, const wchar_t *pwcs, size_t n) ----- 将编码从wchar_t数组中转换为多字节字符,并将其存储在char指针str中。
= int wctomb(char *str, wchar_t wchar)
该函数返回值为 int 类型,并接收两个参数:指针变量 str 和宽字符类型 wchar。
注释部分说明该函数负责确定指定 wide characters 的编码。
}
--标准库 - {
@1 概述:包含头文件string.h用于声明一个变量类型、引入一个宏以及提供与字符数组相关的操作功能。
@2、库变量:size_t ----- 这是无符号整数类型,它是 sizeof 关键字的结果。
@3、库宏:NULL ----- 这个宏是一个空指针常量的值。
@4、库函数:
此函数用于获取在字符串 str 的前 n 个字节中首次出现字符 c 的位置(c为无符号字符)。
= int memcmp(const char[] str1, const char[] str2, size_t n)
用来被比较 str1 和 str2 的前 n 位字符。
=void *memcpy(void *dest, const void *src, size_t n) ----- 从 src 复制 n 个字符到 dest。
该函数也可用作从\texttt{str2}复制\texttt{n}个字符到\texttt{str1}的空指针类型。
此外将\texttt{n}个字符从\texttt{str2}复制至\texttt{str1}。
函数声明为 void *memset 指针变量 str 指向的目标字符串中的无符号字符 c 将被赋值到指针变量 str 所指向的字符串的指定长度的部分。
实现字符指向操作:将 src 指向的字符串追加到 dest 指向的位置。
char* strncat(char* dest, const char* src, size_t n) ------ 将 src 所指字符连接到 dest 所指字符序列末尾,并截断至n个字符。
=char *strchr(const char *str, int c) ---- 在由 str 指向的字符串内查找第一个出现的位置(c 为一个无符号字符)。
该函数是一个用于比较两个指针所指向的字符串的整数形式字符串比较函数。
它接受两个const char*类型的参数str1和str2。
int\ strcmp(const\ char\ *\str1,\ const\ char\ *\str2)的作用是将str1指向的字符串与str2指向的字符串进行比较。
该函数用于将 str1 和 str2 进行对比分析,并限制在最多 n 字节范围内完成比较操作。
int strcoll(const char *str1, const char str2) = 0; / 比较两个字符串 str1 和 str2 */
=char *strcpy(char *dest, const char *src) ----- 把 src 所指向的字符串复制到 dest。
返回类型为char的指针strncpy用于将目标指针dest所指定的位置从源指针src复制n个字符
=size_t string_char_span(const char* str1, const char* str2) ----- 计算字符串 str1 的前几个连续字符中不包含于字符串 str2 中的数量.
定义为 char *strerror(int errnum),该函数用于从内部数组中查找指定的错误号 errnum,并返回一个指向对应错误消息字符串的指针。
const size_t strlen(const char *str) 表示确定字符串 str 的长度,并计算到末尾字符而不包含末尾字符。
=char *strpbrk(const char *str1, const char *str2)-----查找字符串 str1 中第一个匹配字符串 str2 中字符的位置,并忽略空结束符。其作用是逐一检查 str1 的每个字符是否存在于 str2 中;一旦发现匹配的字符,则立即停止检查并返回该位置。
=char *strrchr(const char *str, int c) 表示该函数用于在参数 str 所指向的字符串中查找最后一次出现字符 c 的位置(其中 c 为一个 unsigned 字符)。
const size_t& strspn(const char* str1, const char* str2) =;
// 找出字符在str1中第一次未出现在str2中的位置
返回值为char指针的strstr函数用于在const char* haystack中找到第一个出现const char* needle的位置(其中needle不得包含空终止符)。
== 字符指针 strtok(字符指针 str, const 字符指针 delim) ------ 将字符指针 str 分解为多个字符序列。
= size_t strxfrm(char* dest, const char* src, size_t n) ----- 根据程序当前区域选项中的 LC_COLLATE 将字符串 src 的前 n 个字符进行复制,并将这些字符复制到目标字符数组 dest 中。
}
--标准库 - {
@1、简介:time.h 头文件中包含有四种数据类型、两个预定义常量以及提供处理日期与时间功能的各种函数。
@2、库变量:
=size_t ----- 是无符号整数类型,它是 sizeof 关键字的结果。
=clock_t ----- 这是一个适合存储处理器时间的类型。
=time_t is --- 这是一个适合存储日历时间类型。
=struct tm ---- 这是一个用来保存时间和日期的结构。
@3、库宏:
=NULL ----- 这个宏是一个空指针常量的值。
=CLOCKS_PER_SEC ----- 这个宏表示每秒的处理器时钟个数。
@4、库函数:
=char *asketime(const struct tm *timeptr)-----表示与时间相关的指针。
=clock_t clock(void) ---- 表示程序运行开始前由 CPU 所使用的时钟时间单位。
返回一个指向 char 类型的指针变量 ctime, 其中 const time_t timer_p 是用于计算本地时间的时间戳指针。
双精度difftime(time_t time1,time_t time2) 计算时间差为时间1减去时间2的时间差(time1-time2)。
=struct tm *gmtime(const time_t *timer)
timer 的值被解析为 struct tm 格式,并采用协调世界时(UTC)也被称为格林尼治标准时间(GMT)的方式表示。
=struct tm *localtime(const time_t *timer)-----将 timer 的值解析为 struct tm 格式,并转换为本地时区的时间表示。
=time_t mktime(struct tm *timeptr) 旨在将 timeptr 指向的结构转换为对应本地时区的时间_t 数值。
根据 max\_size 根据 format 格式化规则对 time\_structure 进行格式化,并将结果存储在 str 指针中。
=time_t time(time_t *timer) ----- 计算当前日历时间,并把它编码成 time_t 格式。
}
】
