引言
上篇介绍了 ThreadPoolExecutor
配置和扩展相关的信息,本篇开始将介绍递归算法的并行化。
还记得我们在《Java并发编程学习11-任务执行演示》中,对页面绘制程序进行一系列改进,这些改进大大地提供了页面绘制的并行性。
上篇介绍了 ThreadPoolExecutor
配置和扩展相关的信息,本篇开始将介绍递归算法的并行化。
还记得我们在《Java并发编程学习11-任务执行演示》中,对页面绘制程序进行一系列改进,这些改进大大地提供了页面绘制的并行性。
函数声明 | 函数功能 |
---|---|
int raise(int sig); |
用于向当前进程发送指定的信号。 |
int rand(void); |
用于生成伪随机数 |
ssize_t read(int fd, void *buf, size_t count); |
用于从文件描述符读取数据的函数。 |
void *realloc(void *ptr, size_t size); |
用于重新分配已经分配过内存的空间大小。 |
void rectangle( int left, int top, int right, int bottom); |
画一个矩形 |
int registerbgidriver(void(*driver)(void)); |
用于将BGI(Borland Graphics Interface)驱动程序注册到系统中 |
int remove(char *filename); |
用于删除指定的文件 |
int rename(char *oldname, char *newname); |
用于重命名或移动文件。 |
void restorecrtmode(void); |
将图形模式恢复到文本模式 |
void rewind(FILE *stream); |
将文件指针 stream 指向的文件位置重置为文件开头,同时清除任何错误或文件结束标志。 |
int rmdir(const char *path); |
用于删除一个空目录,即该目录必须为空。 |
double round(double x); |
将传入的实数参数 x 四舍五入为最接近的整数(double) |
float roundf(float x); |
将传入的实数参数 x 四舍五入为最接近的整数(float) |
long double roundl(long double x); |
将传入的实数参数 x 四舍五入为最接近的整数(long double) |
double remainder(double x, double y); |
用于计算两个浮点数的余数(即模运算结果)(double) |
float remainderf (float x, float y ); |
用于计算两个浮点数的余数(即模运算结果)(float) |
long double remainderl (long double x, long double y); |
用于计算两个浮点数的余数(即模运算结果)(long double) |
double remquo(double x, double y, int *quo); |
用于计算两个浮点数的余数,并返回商和余数。 |
float remquof(float x, float y, int *quo); |
用于计算两个浮点数的余数,并返回商和余数。 |
long double remquol(long double x, long double y, int *quo); |
用于计算两个浮点数的余数,并返回商和余数。 |
double rint(double x); |
将 x 四舍五入到最接近的整数(double) |
float rintf(float x); |
将 x 四舍五入到最接近的整数(float) |
long double rintl(long double x); |
将 x 四舍五入到最接近的整数(long double) |
函数声明 | 函数功能 |
---|---|
int raise(int sig); |
用于向当前进程发送指定的信号。 |
参数:
返回值:
raise()
函数将返回 0
;1 |
|
在上面的示例中,
signal()
函数设置了一个处理 SIGINT
信号的处理程序 sigint_handler()
。注意:
raise()
函数只能向当前进程发送信号,不能向其他进程发送信号。如果要向其他进程发送信号,可以使用kill()
函数。
函数声明 | 函数功能 |
---|---|
int rand(void); |
用于生成伪随机数 |
返回值:
每次调用它时会返回一个介于 0
和 RAND_MAX
之间的伪随机整数。其中,RAND_MAX
是一个常量,表示返回值的最大值,通常为 32767
。
1 |
|
注意:
rand()
函数返回的随机数序列都是相同的。如果要生成不同的随机数序列,可以使用 srand()
函数提供的种子来初始化随机数发生器。rand()
函数只能生成伪随机数,不能保证其真正的随机性。因此,在需要高度安全性的应用程序中,建议使用更加安全的随机数生成器,如 /dev/random
和 /dev/urandom
等系统提供的硬件随机数生成器。函数声明 | 函数功能 |
---|---|
ssize_t read(int fd, void *buf, size_t count); |
用于从文件描述符读取数据的函数。 |
参数:
1 |
|
在上述的示例中,
BUFFER_SIZE
的字符数组 buffer
;read()
函数读取标准输入【STDIN_FILENO
表示标准输入的文件描述符】中的数据到 buffer
中;函数声明 | 函数功能 |
---|---|
void *realloc(void *ptr, size_t size); |
用于重新分配已经分配过内存的空间大小。 |
参数:
返回值:
ptr
指向的内存区域大小,并返回一个指向新内存起始地址的指针。NULL
。注意: realloc()
函数并不保证原有的内存区域内容会被完全保留。当内存大小增加时,可能会分配新的内存并将原有的数据复制到新内存区域中;当内存大小减小时,则可能截断部分原有的数据。因此,在使用 realloc()
函数时,需要注意备份原有的数据,以免出现数据丢失的情况。
1 |
|
在上面的示例中,
malloc()
函数分配了 10
个整型变量的内存空间,并判断是否分配成功。realloc()
函数将分配的内存空间大小扩充为 20
个整型变量,并判断是否分配成功。注意: 在使用 realloc()
函数时,应该始终检查返回值,以确保分配内存空间成功,避免因内存不足或其他原因导致程序崩溃。另外,也应该避免过度使用 realloc()
函数,因为频繁地重新分配内存会影响程序性能。
函数声明 | 函数功能 |
---|---|
void rectangle( int left, int top, int right, int bottom); |
画一个矩形 |
参数:
left, top, right, bottom,它们分别表示矩形左上角和右下角的坐标。
1 |
|
函数声明 | 函数功能 |
---|---|
int registerbgidriver(void(*driver)(void)); |
用于将BGI(Borland Graphics Interface)驱动程序注册到系统中 |
注意:
它必须在使用任何 BGI 图形函数之前调用。该函数接受一个指向驱动程序结构的指针作为参数,并返回一个整数值以指示是否成功注册了驱动程序。BGI 驱动程序主要用于支持 Borland C++ 等 IDE 环境下的图形绘制和显示操作,它们通常存储在一个单独的库文件中,例如 graphics.h
头文件需要使用的 BGI driver 位于 libbgi.a
文件中。
1 |
|
函数声明 | 函数功能 |
---|---|
int remove(char *filename); |
用于删除指定的文件 |
参数:
返回值:
返回一个整数表示操作是否成功
0
;1 |
|
函数声明 | 函数功能 |
---|---|
int rename(char *oldname, char *newname); |
用于重命名或移动文件。 |
参数:
oldname :
指定要更改的文件名newname :
指定新文件名或包含新路径的新文件名返回值:
0
;1 |
|
函数声明 | 函数功能 |
---|---|
void restorecrtmode(void); |
将图形模式恢复到文本模式 |
1 |
|
函数声明 | 函数功能 |
---|---|
void rewind(FILE *stream); |
将文件指针 stream 指向的文件位置重置为文件开头,同时清除任何错误或文件结束标志。 |
1 |
|
在上述的示例中,
tempnew.txt
的文件;fgets()
函数从文件中读取文本行,并输出内容;rewind()
函数将文件指针重置到文件开头,并再次读取文件内容并输出;函数声明 | 函数功能 |
---|---|
int rmdir(const char *path); |
用于删除一个空目录,即该目录必须为空。 |
参数:
返回值:
0
;-1
,并设置 errno
错误码。1 |
|
在上述的示例中,
test
的目录;file1.txt
和 file2.txt
;rmdir()
函数尝试删除该目录,但会失败,因为该目录不是空的。注意: 如果要删除非空目录,可以使用上面的 remove()
函数来删除目录及其所有内容。
函数声明 | 函数功能 |
---|---|
double round(double x); |
将传入的实数参数 x 四舍五入为最接近的整数(double) |
float roundf(float x); |
将传入的实数参数 x 四舍五入为最接近的整数(float) |
long double roundl(long double x); |
将传入的实数参数 x 四舍五入为最接近的整数(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
double remainder(double x, double y); |
用于计算两个浮点数的余数(即模运算结果)(double) |
float remainderf (float x, float y ); |
用于计算两个浮点数的余数(即模运算结果)(float) |
long double remainderl (long double x, long double y); |
用于计算两个浮点数的余数(即模运算结果)(long double) |
参数:
返回值: x/y
的余数
1 |
|
函数声明 | 函数功能 |
---|---|
double remquo(double x, double y, int *quo); |
用于计算两个浮点数的余数,并返回商和余数。 |
float remquof(float x, float y, int *quo); |
用于计算两个浮点数的余数,并返回商和余数。 |
long double remquol(long double x, long double y, int *quo); |
用于计算两个浮点数的余数,并返回商和余数。 |
参数:
NULL
返回值: 返回 x/y
的余数,并通过 quo
指针返回商。
1 |
|
函数声明 | 函数功能 |
---|---|
double rint(double x); |
将 x 四舍五入到最接近的整数(double) |
float rintf(float x); |
将 x 四舍五入到最接近的整数(float) |
long double rintl(long double x); |
将 x 四舍五入到最接近的整数(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); |
用于将指定数组按指定顺序进行排序 |
void quick_exit(int status); |
它是 C11 标准中新增的函数,用于快速退出程序并执行一些清理操作。它类似于 exit() 函数,但不会调用 atexit() 注册的函数,并且不会刷新标准 I/O 流(例如 stdout 和 stderr )。 |
int qunsetenv(const char *name); |
用于从进程环境中移除指定的环境变量。该函数在某些操作系统上可能不可用,因为它并非标准的 C 语言函数,而是 POSIX 标准中定义的函数。 |
QuRT相关的函数 | 详见 4.1 所示 |
函数声明 | 函数功能 |
---|---|
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); |
用于将指定数组按指定顺序进行排序 |
参数: |
1 |
|
在上述的示例中,
arr
,并计算出数组的长度,赋值给 n
;"Before sorting: 5 2 8 4 1 9 3 6 7"
qsort()
函数将其按照升序排列。qsort()
函数中传入一个比较函数 compare()
,用于比较两个元素的值。”After sorting: 1 2 3 4 5 6 7 8 9“
。注意: 在编写比较函数时,需要根据元素的实际类型进行转换,并确保返回值符合要求(小于零表示第一个元素小于第二个元素,等于零表示两个元素相等,大于零表示第一个元素大于第二个元素)。此外,还需要特别注意参数类型和返回值类型的 const
限定符。
函数声明 | 函数功能 |
---|---|
void quick_exit(int status); |
它是 C11 标准中新增的函数,用于快速退出程序并执行一些清理操作。它类似于 exit() 函数,但不会调用 atexit() 注册的函数,并且不会刷新标准 I/O 流(例如 stdout 和 stderr )。 |
参数: |
1 |
|
在如上的示例中,
at_quick_exit()
函数注册一个清理函数 cleanup()
,当程序使用 quick_exit()
函数退出时,该函数会自动执行。quick_exit()
函数并传入状态码 EXIT_SUCCESS
表示程序正常退出。注意: 在使用 quick_exit()
函数时需要特别小心,因为它不会调用 atexit()
注册的函数,并且可能导致一些资源泄漏或未完成的操作。只有在必须立即结束程序并执行清理操作时,才应该使用该函数。
函数声明 | 函数功能 |
---|---|
int qunsetenv(const char *name); |
用于从进程环境中移除指定的环境变量。该函数在某些操作系统上可能不可用,因为它并非标准的 C 语言函数,而是 POSIX 标准中定义的函数。 |
参数: |
返回值:
0
;1 |
|
在上述这个示例程序中,
setenv()
函数设置了一个名为 MY_VAR
的环境变量;qunsetenv()
函数移除了这个环境变量;NULL
,则说明环境变量已经被成功移除了。注意: 使用 qunsetenv()
函数可以修改当前进程的环境变量,但是对于其他进程或子进程来说,它们的环境变量不受影响。此外,一些操作系统可能不支持对环境变量进行动态修改,因此无法保证 qunsetenv()
函数在所有平台上都能正常工作。
函数声明 | 函数功能 |
---|---|
void *qurt_sysenv_getvirtaddr(void *phys_addr, unsigned int size); |
将物理地址转换为虚拟地址。 |
void *qurt_malloc(unsigned int size); |
动态分配内存 |
void *qurt_calloc(unsigned int nmemb, unsigned int size); |
动态分配内存,并初始化为零。 |
void qurt_free(void *ptr); |
释放动态分配的内存。 |
int qurt_thread_create(qurt_thread_t *tid, const qurt_thread_attr_t *attr, void (*start)(void *), void *arg); |
创建新线程。 |
int qurt_thread_join(qurt_thread_t tid, int *status); |
等待线程结束并释放其资源。 |
unsigned int qurt_thread_get_priority(qurt_thread_t thread); |
用于获取指定线程的优先级。其中参数 thread 是要获取优先级的线程的句柄。返回一个无符号整数,表示线程的优先级。 |
void qurt_thread_set_priority(qurt_thread_t thread, unsigned int priority); |
用于设置指定线程的优先级。其中参数 thread 是要设置优先级的线程的句柄,而参数 priority 是要设置的优先级值。 |
char *qurt_thread_get_name(char *name, qurt_thread_t thread); |
用于获取指定线程的名称。其中参数 name 是一个指向存储线程名称的缓冲区的指针,而参数 thread 是要获取名称的线程的句柄。返回一个指向缓冲区中存储线程名称的指针。 |
void qurt_thread_set_name(qurt_thread_t thread, const char *name); |
用于设置指定线程的名称。其中参数 thread 是要设置名称的线程的句柄,而参数 name 是要设置的线程名称。 |
int qurt_thread_stop(qurt_thread_t thread); |
用于停止指定线程的执行,即立即终止线程的运行。其中参数 thread 是要停止执行的线程的句柄。返回一个整数值,表示是否成功停止线程。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_thread_resume(qurt_thread_t thread); |
用于恢复指定线程的执行,即让线程从上次暂停处继续运行。其中参数 thread 是要恢复执行的线程的句柄。返回一个整数值,表示是否成功恢复线程。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
void qurt_mutex_init(qurt_mutex_t *mutex); |
用于初始化一个互斥锁,即在使用之前必须进行初始化。其中参数 mutex 是指向要初始化的互斥锁对象的指针。 |
void qurt_mutex_lock(qurt_mutex_t *mutex); |
用于以阻塞方式获取一个互斥锁。如果该互斥锁已被其他线程锁定,则当前线程将一直等待,直到可以获取该锁。其中参数 mutex 是指向要获取的互斥锁对象的指针。 |
void qurt_mutex_unlock(qurt_mutex_t *mutex); |
用于释放一个互斥锁,即解除对该互斥锁的占用。其中参数 mutex 是指向要释放的互斥锁对象的指针。 |
void qurt_timer_sleep(unsigned int ticks); |
用于让当前线程进入休眠状态,休眠时间由参数 ticks 指定(每个 tick 的长度取决于系统时钟频率)。在休眠期间,该线程将不会被调度执行。注意,该函数可能会提前唤醒线程,因此休眠时间并不精确。 |
void qurt_signal_init(qurt_signal_t *signal); |
用于初始化一个信号量,即在使用之前必须进行初始化。其中参数 signal 是指向要初始化的信号量对象的指针。 |
unsigned int qurt_signal_wait(qurt_signal_t *signal, unsigned int mask, unsigned int option, unsigned int *ret_signal); |
用于等待一个或多个信号量的触发。其中参数 signal 是指向要等待的信号量对象的指针,参数 mask 表示要等待哪些信号量,参数 option 用于指定等待的行为选项,参数 ret_signal 用于返回实际触发的信号量。 |
void qurt_signal_set(qurt_signal_t *signal, unsigned int mask); |
用于触发一个或多个信号量。其中参数 signal 是指向要触发的信号量对象的指针,参数 mask 表示要触发哪些信号量。 |
void qurt_signal2_init(qurt_signal2_t *signal); |
用于初始化一个带有两个信号量的信号量对象。其中参数 signal 是指向要初始化的信号量对象的指针。 |
void qurt_signal2_destroy(qurt_signal2_t *signal); |
用于销毁带有两个信号量的信号量对象,并释放其占用的内存空间。其中参数 signal 是要销毁的信号量对象的指针。 |
void qurt_signal2_set(qurt_signal2_t *signal, unsigned int mask); |
用于设置带有两个信号量的信号量对象中的一个或多个信号量。其中参数 signal 是要设置信号量的信号量对象的指针,而参数 mask 是一个 32 位无符号整数,表示要设置的信号量掩码。掩码中每个位代表一个信号量,如果该位为 1 ,则表示相应的信号量被设置;如果该位为 0 ,则表示相应的信号量未被设置。 |
unsigned int qurt_signal2_wait(qurt_signal2_t *signal, unsigned int mask, unsigned int options); |
用于等待带有两个信号量的信号量对象中指定的信号量被触发。其中参数 signal 是要等待的信号量对象的指针,而参数 mask 是一个 32 位无符号整数,表示要等待的信号量掩码。掩码中每个位代表一个信号量,如果该位为 1 ,则表示相应的信号量需要被触发;如果该位为 0 ,则表示相应的信号量不需要被触发。参数 options 则指定等待信号量的选项,例如是否超时等。它返回一个 32 位无符号整数,表示哪些信号量已被触发。返回值中每个位代表一个信号量,如果该位为 1 ,则表示相应的信号量已被触发;如果该位为 0 ,则表示相应的信号量未被触发。 |
void qurt_timer_create(qurt_timer_t *timer, const char *name); |
用于创建一个新的定时器。其中参数 timer 是指向要创建的定时器对象的指针,参数 name 是定时器的名称(可以为 NULL )。 |
void qurt_timer_delete(qurt_timer_t timer); |
用于删除一个已经创建的定时器。其中参数 timer 是要删除的定时器对象。 |
void qurt_timer_start(qurt_timer_t timer, uint32_t duration); |
用于启动一个定时器,并指定定时器的超时时间。其中参数 timer 是要启动的定时器对象,参数 duration 是定时器的超时时间(以 tick 为单位)。 |
void qurt_timer_stop(qurt_timer_t timer); |
用于停止一个已经运行的定时器。其中参数 timer 是要停止的定时器对象。 |
qurt_thread_t qurt_thread_get_id(void); |
用于获取当前线程的 ID 。 |
int qurt_mem_region_create(qurt_mem_region_t *region, unsigned int size, qurt_mem_cache_mode_t cache_attrib, qurt_mem_region_type_t type); |
用于创建一个内存区域对象,并分配指定大小的内存空间。其中参数 region 是指向要创建的内存区域对象的指针,参数 size 指定内存区域的大小,而 cache_attrib 和 type 分别指定内存区域的缓存属性和类型。返回一个整数值,表示是否成功创建内存区域。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_mem_region_delete(qurt_mem_region_t region); |
用于删除指定的内存区域对象,并释放其占用的内存空间。其中参数 region 是要删除的内存区域对象的句柄。返回一个整数值,表示是否成功删除内存区域。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
void qurt_mem_region_attr_init(qurt_mem_region_attr_t *attr); |
用于初始化一个内存区域属性对象。其中参数 attr 是指向要初始化的内存区域属性对象的指针。 |
int qurt_mem_pool_create(qurt_mem_pool_t *pool, void *baseaddr, unsigned int size, qurt_mem_cache_mode_t cache_attrib); |
用于创建一个内存池对象,并分配指定大小的内存空间。其中参数 pool 是指向要创建的内存池对象的指针,参数 baseaddr 指定内存池的起始地址,而 size 和 cache_attrib 分别指定内存池的大小和缓存属性。返回一个整数值,表示是否成功创建内存池。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_mem_pool_delete(qurt_mem_pool_t pool); |
用于删除指定的内存池对象,并释放其占用的内存空间。其中参数 pool 是要删除的内存池对象的句柄。返回一个整数值,表示是否成功删除内存池。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_pipe_create(qurt_pipe_t *pipe, unsigned int pipe_type, unsigned int pipe_elements, unsigned int elem_size); |
用于创建一个管道对象,并分配指定大小的内存空间。其中参数 pipe 是指向要创建的管道对象的指针,参数 pipe_type 指定管道类型,参数 pipe_elements 指定管道元素个数,而 elem_size 指定每个管道元素的大小。 返回一个整数值,表示是否成功创建管道。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_pipe_delete(qurt_pipe_t pipe); |
用于删除指定的管道对象,并释放其占用的内存空间。其中参数 pipe 是要删除的管道对象的句柄。返回一个整数值,表示是否成功删除管道。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_pipe_send(qurt_pipe_t pipe_id, void *buf, unsigned int size, unsigned int timeout); |
用于向指定的管道发送数据。其中参数 pipe_id 是要发送数据的管道对象的句柄,参数 buf 指向要发送的数据缓冲区,参数 size 指定要发送的数据大小,而 timeout 指定等待发送操作完成的超时时间(单位为 ticks)。 返回一个整数值,表示是否成功发送数据。如果成功,则返回 0 ;否则返回一个负数错误代码。 |
int qurt_pipe_receive(qurt_pipe_t pipe_id, void *buf, unsigned int size, unsigned int *recv_size, unsigned int timeout); |
用于从指定的管道接收数据。其中参数 pipe_id 是要接收数据的管道对象的句柄,参数 buf 指向接收数据的缓冲区,参数 size 指定要接收的数据大小,而 recv_size 是一个指针,用于返回实际接收到的数据大小。参数 timeout 指定等待接收操作完成的超时时间(单位为 ticks )。返回一个整数值,表示是否成功接收数据。如果成功,则返回 0;否则返回一个负数错误代码。 |
1 |
|
在上述的示例中,我们使用 qurt_thread_create()
函数创建了两个线程,分别执行 task1()
和 task2()
函数,并使用 qurt_thread_join()
函数等待它们结束。
注意: 在开发过程中,需要根据实际情况合理使用内存管理函数和多任务调度函数,并避免出现死锁、资源泄漏等问题。
1 |
|
在上面这个示例程序中,
qurt_mutex_init()
函数初始化了一个互斥锁对象。increment_global_counter()
函数来增加全局计数器 global_counter
的值。由于多个线程可能同时访问该共享资源,因此在访问之前需要先获取互斥锁,以避免竞争条件的发生。在 increment_global_counter()
函数中,我们使用 qurt_mutex_lock()
函数获取互斥锁,并使用 qurt_mutex_unlock()
函数释放互斥锁。1 |
|
在上述的示例程序中,
qurt_signal_init()
函数初始化了一个信号量对象。qurt_signal_wait()
函数等待信号量,当信号量触发时才能访问共享资源,并使用 qurt_signal_set()
函数释放信号量。qurt_thread_join()
函数等待两个线程结束;1 |
|
在上述的示例程序中,
qurt_timer_create()
函数创建了一个定时器。qurt_timer_start()
函数启动了该定时器,并指定了定时器的超时时间(1000
毫秒)。qurt_timer_set_attr()
函数注册了定时器回调函数。10
毫秒调用 qurt_timer_sleep()
函数进入休眠状态,等待定时器超时。当定时器超时时,将触发定时器回调函数 timer_callback(),输出一条消息。注意: 在程序结束时需要使用 qurt_timer_stop()
停止定时器,并使用 qurt_timer_delete()
删除定时器对象。
1 |
|
在上述这个示例程序中,
qurt_mem_region_create()
函数创建了一个大小为 SHM_SIZE
的共享内存区域,并设置其缓存属性为 QURT_MEM_CACHE_NONE
,类型为 QURT_MEM_REGION_SHARED
,并且具有读写权限。printf()
函数打印了从共享内存区域中读取的数据。qurt_mem_region_delete()
函数删除了共享内存区域。1 |
|
在上述示例程序中,
qurt_pipe_create()
函数创建一个大小为 1024 字节的管道对象,属性设置为阻塞式字节队列。qurt_thread_create()
函数创建了一个名为 child
的子线程,并将管道对象传递给它。我们在 child_thread()
函数中调用了 qurt_pipe_receive()
函数来从管道接收数据,然后使用 printf()
函数打印出接收到的字符串。msg
,并使用 qurt_pipe_send()
函数向管道发送该字符串。qurt_pipe_delete()
函数删除了管道对象。函数声明 | 函数功能 |
---|---|
void perror(const char *s); |
用于将当前错误码对应的错误信息打印到标准输出设备(通常是终端)。 |
void pieslice(int x, int y, int stanle, int endangle, int radius); |
在图形模式下绘制并填充一个扇形(饼图切片) |
double pow(double x, double y); |
用于计算 x 的 y 次幂,并返回结果(double) |
float powf(float x, float y); |
用于计算 x 的 y 次幂,并返回结果(float) |
long double powl(long double x, long double y); |
用于计算 x 的 y 次幂,并返回结果(long double) |
double pow10(double x); |
用于计算 $10^x$ (double) |
float pow10f(float x); |
用于计算 $10^x$(float) |
long double pow10l(long double x); |
用于计算 $10^x$ (long double) |
int printf(const char *format, ...); |
它是标准 I/O 库中定义的函数,用于将格式化的数据输出到标准输出流(通常是控制台窗口) |
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); |
创建一个新的线程 |
int pthread_join(pthread_t thread, void **retval); |
阻塞当前线程,等待指定的线程结束。 |
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); |
初始化互斥锁。返回值为 0 表示成功,否则表示失败。 |
int pthread_mutex_destroy(pthread_mutex_t *mutex); |
销毁互斥锁。返回值为 0 表示成功,否则表示失败。 |
int pthread_mutex_lock(pthread_mutex_t *mutex); |
尝试获取互斥锁,如果已经被占用,则会阻塞当前线程。返回值为 0 表示成功获取互斥锁,否则表示失败。 |
int pthread_mutex_unlock(pthread_mutex_t *mutex); |
释放互斥锁。 |
int putc(int c, FILE *stream); |
它是标准 I/O 库中定义的函数,用于将一个字符输出到指定的文件流。 |
int putchar(int c); |
它是标准 I/O 库中定义的函数,用于将一个字符输出到标准输出流(通常是控制台窗口)。 |
int putenv(char *string); |
用于设置环境变量的值。 |
void putimage(int left, int top, void *bitmap, int op); |
用于将位图图像输出到指定的窗口或屏幕上 |
void putpixel(int x, int y, int color); |
用于将一个像素点画在指定的位置上 |
int puts(const char *s); |
用于将一个字符串输出到标准输出流 |
int putw(int w, FILE *stream); |
用于将一个整数值以二进制形式写入到指定的文件中。 |
函数声明 | 函数功能 |
---|---|
void perror(const char *s); |
用于将当前错误码对应的错误信息打印到标准输出设备(通常是终端)。 |
参数:
1 |
|
在上述的示例中,
fopen()
函数返回的值来检查是否成功。由于该文件不存在,fopen()
函数将返回 NULL
;perror()
函数来输出一个错误消息和具体的错误信息,以帮助我们找到问题所在。如果发生了错误,errno
全局变量会被设置为一个非零值,我们还可以使用它来获取具体的错误代码。函数声明 | 函数功能 |
---|---|
void pieslice(int x, int y, int stanle, int endangle, int radius); |
在图形模式下绘制并填充一个扇形(饼图切片) |
参数:
- radius : 圆的半径
1 |
|
函数声明 | 函数功能 |
---|---|
double pow(double x, double y); |
用于计算 x 的 y 次幂,并返回结果(double) |
float powf(float x, float y); |
用于计算 x 的 y 次幂,并返回结果(float) |
long double powl(long double x, long double y); |
用于计算 x 的 y 次幂,并返回结果(long double) |
1 |
|
函数声明 | 函数功能 |
---|---|
double pow10(double x); |
用于计算 $10^x$ (double) |
float pow10f(float x); |
用于计算 $10^x$(float) |
long double pow10l(long double x); |
用于计算 $10^x$ (long double) |
1 |
|
1 |
|
函数声明 | 函数功能 |
---|---|
int printf(const char *format, ...); |
它是标准 I/O 库中定义的函数,用于将格式化的数据输出到标准输出流(通常是控制台窗口) |
参数: |
返回值 :
1 |
|
函数声明 | 函数功能 |
---|---|
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); |
创建一个新的线程 |
int pthread_join(pthread_t thread, void **retval); |
阻塞当前线程,等待指定的线程结束。 |
pthread_create 参数:
NULL
表示使用默认属性pthread_join 参数:
pthread_t thread
:目标线程的标识符(由 pthread_create() 返回)。必须是已创建且未被分离(non-detached)的线程。void **retval
:用于接收目标线程的退出状态值的指针的地址。return
返回值或调用 pthread_exit(void *retval)
终止,retval
将指向该值。NULL
。retval
会被设为 PTHREAD_CANCELED
(通常为 -1)。1 |
|
在上述的示例中,主线程调用了 pthread_create()
函数来创建一个新的线程,并传递一个函数指针 thread_func
作为新线程的入口点。新线程运行这个函数,并输出一条消息。主线程等待新线程结束,然后继续运行自己的代码。
函数声明 | 函数功能 |
---|---|
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); |
初始化互斥锁。返回值为 0 表示成功,否则表示失败。 |
int pthread_mutex_destroy(pthread_mutex_t *mutex); |
销毁互斥锁。返回值为 0 表示成功,否则表示失败。 |
int pthread_mutex_lock(pthread_mutex_t *mutex); |
尝试获取互斥锁,如果已经被占用,则会阻塞当前线程。返回值为 0 表示成功获取互斥锁,否则表示失败。 |
int pthread_mutex_unlock(pthread_mutex_t *mutex); |
释放互斥锁。 |
参数:
NULL
表示使用默认属性。1 |
|
在上述的示例中,两个线程分别调用了 pthread_mutex_lock()
和 pthread_mutex_unlock()
函数来保护临界区代码,以确保同时只有一个。
函数声明 | 函数功能 |
---|---|
int putc(int c, FILE *stream); |
它是标准 I/O 库中定义的函数,用于将一个字符输出到指定的文件流。 |
参数:
返回值:
1 |
|
在上述的示例中,我们打开名为 output.txt
的文件以供写入,并使用 putc()
函数将字符串中的每个字符逐一输出到文件中。最后,我们关闭文件。
注意: 与
putchar()
函数类似,putc()
函数可以用来逐一输出字符串中的每个字符,但通常会更多地用于将数据写入文件或其他输出流。
函数声明 | 函数功能 |
---|---|
int putchar(int c); |
它是标准 I/O 库中定义的函数,用于将一个字符输出到标准输出流(通常是控制台窗口)。 |
参数:
返回值 :
1 |
|
注意: 单引号用于表示字符常量,例如 ‘H’ 表示字符 H 的 ASCII 码。
函数声明 | 函数功能 |
---|---|
int putenv(char *string); |
用于设置环境变量的值。 |
参数:
返回值:
0
表示成功;0
表示失败。1 |
|
在上述的示例中,
putenv()
函数将一个名为 MY_VAR 的环境变量设置为字符串 "hello"
。getenv()
函数获取 MY_VAR
环境变量的值;printf()
函数输出它。注意: 由于
putenv()
函数接受一个指向可变字符串的指针,因此应该避免将局部变量的地址传递给它,以免在函数返回后出现未定义行为。
函数声明 | 函数功能 |
---|---|
void putimage(int left, int top, void *bitmap, int op); |
用于将位图图像输出到指定的窗口或屏幕上 |
参数:
x
坐标y
坐标COPY_PUT
:覆盖模式,即将位图完全覆盖到目标位置。AND_PUT
:按位与模式,即将位图与目标位置进行按位与运算后输出。OR_PUT
:按位或模式,即将位图与目标位置进行按位或运算后输出。XOR_PUT
:按位异或模式,即将位图与目标位置进行按位异或运算后输出。1 |
|
上述程序使用了 graphics.h
图形库来画一个箭头,并在屏幕上循环移动它。
getmaxx()
和 getmaxy()
函数获取屏幕的宽度和高度。draw_arrow()
函数来绘制箭头图形,并使用 imagesize()
函数计算出需要分配给位图数据的内存大小。malloc()
函数动态分配了一块内存空间,并调用 getimage()
函数获取箭头图像的位图数据。该函数会将指定位置的屏幕区域保存到指定的内存地址中。putimage()
函数将之前存储的箭头图像覆盖掉屏幕上的箭头,然后将箭头向右移动一定的距离。当用户按下任意键时,程序结束循环并退出。函数声明 | 函数功能 |
---|---|
void putpixel(int x, int y, int color); |
用于将一个像素点画在指定的位置上 |
参数:
x
坐标y
坐标1 |
|
上述这个程序使用 graphics.h
图形库在屏幕上绘制随机像素点,并不断更新它们的颜色。
getmaxx()
、getmaxy()
和 getmaxcolor()
函数获取屏幕的尺寸和颜色范围。rand()
函数生成随机的坐标和颜色值,并使用 putpixel()
函数绘制对应位置的像素点。另外还使用了 delay()
函数来控制每次更新之间的时间间隔,该函数会使程序暂停指定的毫秒数,以便让用户观察到像素点的变化效果。函数声明 | 函数功能 |
---|---|
int puts(const char *s); |
用于将一个字符串输出到标准输出流 |
参数:
'\0'
结尾的字符串返回值:
1 |
|
注意: 在输出字符串时,
puts()
函数会自动将字符串的内容和换行符写入到标准输出流中,因此不需要再进行额外的操作。如果要将字符串输出到文件或其他输出流中,则可以使用fputs()
函数。
函数声明 | 函数功能 |
---|---|
int putw(int w, FILE *stream); |
用于将一个整数值以二进制形式写入到指定的文件中。 |
参数:
返回值:
4
个字节);EOF
。1 |
|
在上述的示例中,
fopen()
函数打开一个名为 "output.bin"
的二进制文件;putw()
函数将整数值写入到该文件中;注意: 由于
putw()
函数是以二进制形式写入数据的,因此相对于文本文件而言,它更适合用于存储数字、结构体等复杂类型的数据。如果要将字符串或其他文本数据写入到文件中,则可以使用fprintf()
函数。
函数声明 | 函数功能 |
---|---|
void obstack_init(struct obstack *obstack_ptr); |
它是 POSIX 标准库中的一个非标准函数,用于初始化对象堆栈。对象堆栈是一种可以动态增长以存储任意类型的对象的数据结构。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要初始化的对象堆栈。 |
void obstack_free(struct obstack *obstack_ptr, void *object_ptr); |
用于释放通过对象堆栈分配的所有内存。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要释放的对象堆栈;object_ptr 参数是要释放的内存块。 |
void *obstack_alloc(struct obstack *obstack_ptr, int size); |
用于从对象堆栈中分配指定大小的内存,并返回其地址。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要从中分配内存的对象堆栈;size 参数表示要分配的内存块的大小。 |
void *obstack_blank(struct obstack *obstack_ptr, int size); |
用于向对象堆栈添加指定数量的空间,并返回指向添加的第一个字节的指针。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要添加空间的对象堆栈;size 参数表示要添加的空间大小。 |
void *obstack_grow(struct obstack *obstack_ptr, const void *data, int size); |
用于将数据复制到对象堆栈,并返回指向添加的第一个字节的指针。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要添加数据的对象堆栈;data 参数是要复制的数据的指针;size 参数表示要复制的数据的大小。 |
#define offsetof(type, member) ((size_t)(&((type *)0)->member)) |
它是一个宏,用于获取结构体中某个成员的偏移量。 |
int open(const char *path, int oflag, ...); |
用于打开文件 |
int openat(int dirfd, const char *pathname, int flags, mode_t mode); |
它是 Linux 系统定义的一个函数,它可以打开一个相对于指定目录的文件。与 open() 函数相比,openat() 函数更加灵活,并支持更多的选项。 |
DIR *opendir(const char *name); |
它是 POSIX 标准定义的一个函数,用于打开目录并返回一个指向 DIR 结构体类型的指针。 |
int openpty(int *amaster, int *aslave, char *name, const struct termios *termp, const struct winsize *winp); |
它是 POSIX 标准定义的一个函数,用于打开一个伪终端(PTY)并返回与之关联的主从设备文件描述符。伪终端可以用于在进程之间建立通信,或者在程序中模拟终端行为。 |
int on_exit(void (*function)(int, void *), void *arg); |
它是 POSIX 标准定义的一个函数,用于在进程退出时调用注册的回调函数。这个函数可以用于在程序异常退出或者正常退出时执行一些清理工作、记录日志等操作 |
void outtext(char *textstring); |
在图形视区显示一个字符串 |
void outtextxy(int x, int y, char *textstring); |
在指定位置显示一字符串 |
函数声明 | 函数功能 |
---|---|
void obstack_init(struct obstack *obstack_ptr); |
它是 POSIX 标准库中的一个非标准函数,用于初始化对象堆栈。对象堆栈是一种可以动态增长以存储任意类型的对象的数据结构。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要初始化的对象堆栈。 |
void obstack_free(struct obstack *obstack_ptr, void *object_ptr); |
用于释放通过对象堆栈分配的所有内存。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要释放的对象堆栈;object_ptr 参数是要释放的内存块。 |
void *obstack_alloc(struct obstack *obstack_ptr, int size); |
用于从对象堆栈中分配指定大小的内存,并返回其地址。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要从中分配内存的对象堆栈;size 参数表示要分配的内存块的大小。 |
void *obstack_blank(struct obstack *obstack_ptr, int size); |
用于向对象堆栈添加指定数量的空间,并返回指向添加的第一个字节的指针。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要添加空间的对象堆栈;size 参数表示要添加的空间大小。 |
void *obstack_grow(struct obstack *obstack_ptr, const void *data, int size); |
用于将数据复制到对象堆栈,并返回指向添加的第一个字节的指针。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要添加数据的对象堆栈;data 参数是要复制的数据的指针;size 参数表示要复制的数据的大小。 |
1 |
|
在上述的程序中,
my_obstack
的 struct obstack
类型变量,并将其传递给 obstack_init()
函数以初始化对象堆栈。obstack_alloc()
函数从对象堆栈中分配一块内存,并将两个字符串连接起来。obstack_blank()
函数向对象堆栈添加一块指定大小的空间,并使用 memcpy()
函数将两个整数复制到该空间中。obstack_grow()
函数向对象堆栈添加一个双精度浮点数,并返回指向该浮点数的指针。printf()
函数将连接后的字符串、添加的整数和添加的双精度浮点数输出到终端,并使用 obstack_free()
函数释放通过对象堆栈分配的所有内存。注意:在使用
obstack_blank()
函数向对象堆栈添加空间时,建议使用sizeof
运算符来计算要添加的空间大小,并在使用memcpy()
复制数据时也应该小心不要越界。同时,在使用obstack_grow()
函数向对象堆栈添加数据时,需要小心指针是否正确,并且操作前需要先使用memcpy()
将要添加的数据复制到一个临时变量中。
宏定义 | 宏描述 |
---|---|
#define offsetof(type, member) ((size_t)(&((type *)0)->member)) |
它是一个宏,用于获取结构体中某个成员的偏移量。 |
参数:
返回值: 一个 size_t 类型的值,表示该成员变量在结构体中的偏移量(单位是字节)。
1 |
|
在这个程序中,
example
的结构体类型,并使用 offsetof
宏获取结构体中成员变量 b
的偏移量。printf()
函数将结果输出到终端。注意: 在使用
offsetof
宏时,结构体类型名称必须使用括号括起来,否则代码会产生语法错误。此外,offsetof
宏的参数必须是已定义的结构体类型名称和该结构体类型中的成员变量名称,否则也会导致编译错误。
函数声明 | 函数功能 |
---|---|
int open(const char *path, int oflag, ...); |
用于打开文件 |
参数:
O_RDONLY
:只读模式打开文件。O_WRONLY
:只写模式打开文件。O_RDWR
:读写模式打开文件。O_CREAT
:如果文件不存在,则创建它。O_TRUNC
:如果文件已存在,则将其长度截断为 0。O_APPEND
:在文件末尾追加数据。O_CREAT
选项,则必须提供这个参数1 |
|
在上述的程序中,
open()
函数打开文件 temp.txt
,并通过 read()
函数读取其中的数据。write()
函数将数据写入标准输出,直到读取完整个文件。close()
函数关闭文件。注意: 在使用
open()
函数打开文件时,返回值为负数则表示出现了错误。此时可以使用perror()
函数输出错误信息,并使用exit()
函数退出程序。同时,在使用read()
函数和write()
函数读写文件时也需要小心处理返回值,以避免出现不可预期的错误。
函数声明 | 函数功能 |
---|---|
int openat(int dirfd, const char *pathname, int flags, mode_t mode); |
它是 Linux 系统定义的一个函数,它可以打开一个相对于指定目录的文件。与 open() 函数相比,openat() 函数更加灵活,并支持更多的选项。 |
参数:
AT_FDCWD
,则表示使用当前工作目录。O_RDONLY
:只读模式打开文件。O_WRONLY
:只写模式打开文件。O_RDWR
:读写模式打开文件。O_CREAT
:如果文件不存在,则创建它。O_TRUNC
:如果文件已存在,则将其长度截断为 0。O_APPEND
:在文件末尾追加数据。O_DIRECTORY
:要求打开的文件必须是一个目录。O_NOFOLLOW
:不跟随符号链接打开文件。O_CREAT
选项,则必须提供这个参数1 |
|
在这个程序中,
openat()
函数打开当前目录,并通过 fdopendir()
函数将文件描述符转换为目录流。readdir()
函数读取目录中的文件,并将文件名输出到终端。closedir()
函数关闭目录。注意: 在使用
openat()
函数打开文件时,可以通过传递不同的文件描述符指定要打开的目录,从而实现更加灵活的操作。此外,在使用readdir()
函数读取目录时也需要注意判断返回值是否为NULL
,以避免出现不可预期的错误。
函数声明 | 函数功能 |
---|---|
DIR *opendir(const char *name); |
它是 POSIX 标准定义的一个函数,用于打开目录并返回一个指向 DIR 结构体类型的指针。 |
参数:
返回值:
DIR
类型的指针;NULL
。1 |
|
在上述的程序中,我们使用 opendir()
函数打开当前目录,并通过 readdir()
函数读取目录中的文件名,最后使用 closedir()
函数关闭目录。
注意: 在使用
opendir()
函数打开目录时,返回值为NULL
则表示出现了错误。此时可以使用perror()
函数输出错误信息,并使用exit()
函数退出程序。同时,在使用readdir()
函数读取目录时也需要小心处理返回值,以避免出现不可预期的错误。
函数声明 | 函数功能 |
---|---|
int openpty(int *amaster, int *aslave, char *name, const struct termios *termp, const struct winsize *winp); |
它是 POSIX 标准定义的一个函数,用于打开一个伪终端(PTY)并返回与之关联的主从设备文件描述符。伪终端可以用于在进程之间建立通信,或者在程序中模拟终端行为。 |
参数:
NULL
NULL
NULL
返回值:
0
;-1
。1 |
|
在上述的程序中,
openpty()
函数打开一个伪终端,并通过 read()
函数读取标准输入中的数据。注意: 在使用
openpty()
函数打开伪终端时,返回值为-1
则表示出现了错误。此时可以使用perror()
函数输出错误信息,并使用exit()
函数退出程序。同时,在使用read()
函数和write()
函数读写文件时也需要小心处理返回值,以避免出现不可预期的错误。
函数声明 | 函数功能 |
---|---|
int on_exit(void (*function)(int, void *), void *arg); |
它是 POSIX 标准定义的一个函数,用于在进程退出时调用注册的回调函数。这个函数可以用于在程序异常退出或者正常退出时执行一些清理工作、记录日志等操作 |
参数:
返回值:
0
;-1
。1 |
|
在如上的程序中,
on_exit()
函数注册了一个回调函数 cleanup()
,并将其参数设置为 NULL。函数声明 | 函数功能 |
---|---|
void outtext(char *textstring); |
在图形视区显示一个字符串 |
参数:
char *textstring
:指向以空字符(’\0’)结尾的字符串的指针。1 |
|
在上述的程序中,
initgraph()
函数初始化图形系统;moveto()
函数将当前绘图位置移动到屏幕中心。outtext()
函数输出一段文字,然后等待用户按下任意键,并关闭图形窗口。函数声明 | 函数功能 |
---|---|
void outtextxy(int x, int y, char *textstring); |
在指定位置显示一字符串 |
参数:
int x
: 字符串输出的水平起始坐标(单位为像素)。取值范围:与当前图形模式的屏幕分辨率相关(例如,640x480 模式下,x 范围为 0 到 639)。
int y
: 字符串输出的垂直起始坐标(单位为像素)。取值范围:与当前图形模式的屏幕分辨率相关(例如,480p 模式下,y 范围为 0 到 479)。
char *textstring
: 指向以空字符(’\0’)结尾的字符串的指针。
1 |
|
在上述这个程序中,
initgraph()
函数初始化图形系统并创建一个窗口;(x, y)
并使用 outtextxy()
函数在该位置输出一段文本。getch
函数等待用户按下任意键,然后关闭图形窗口。函数声明 | 函数功能 |
---|---|
double nan(const char *tagp); |
用于返回一个表示 NaN(非数值)的 double 类型数字 |
int nanosleep(const struct timespec *req, struct timespec *rem); |
用于暂停当前进程的执行一段指定的时间。相比于 sleep() 函数,nanosleep() 函数可以精确地指定等待时间,以纳秒为单位。 |
double nearbyint(double x); |
用于将一个浮点数四舍五入到最接近的整数值(double) |
float nearbyintf(float x); |
用于将一个浮点数四舍五入到最接近的整数值(float) |
long double nearbyintl(long double x); |
用于将一个浮点数四舍五入到最接近的整数值(long double) |
double nextafter(double x, double y); |
用于找出与给定的浮点数最接近的下一个浮点数(double) |
float nextafterf(float x, float y); |
用于找出与给定的浮点数最接近的下一个浮点数(float) |
long double nextafterl(long double x, long double y); |
用于找出与给定的浮点数最接近的下一个浮点数(long double) |
double nexttoward(double x, long double y); |
用于找出与给定的浮点数最接近、并朝着指定方向的下一个浮点数(double) |
float nexttowardf(float x, long double y); |
用于找出与给定的浮点数最接近、并朝着指定方向的下一个浮点数(float) |
long double nexttowardl(long double x, long double y); |
用于找出与给定的浮点数最接近、并朝着指定方向的下一个浮点数(long double) |
locale_t newlocale(int category_mask, const char *locale, locale_t base); |
用于创建并返回一个新的本地化环境变量,以便在不同的本地化设置之间进行切换。 |
int nftw(const char *dirpath, int (*fn)(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf), int nopenfd, int flags); |
用于递归遍历指定目录下的所有文件和子目录,并对每个文件或目录执行指定操作。 |
int nice(int inc); |
它是一个系统调用,可将进程截止到当前用户的最大优先级减少指定的优先级,以更改进程的调度优先级。较高的 niceness 值意味着较低的优先级。 |
char *nl_langinfo(nl_item item); |
它是一个 POSIX 标准函数,用于获取当前本地化环境下的语言环境信息。它可以返回一些与语言、货币、日期和时间格式等相关的信息。 |
long nrand48(unsigned short xsubi[3]); |
用于生成带有指定状态的随机数。它使用 48 位整数来表示随机数的状态,可以方便地切换不同的随机数生成器状态。 |
uint32_t ntohl(uint32_t netlong); |
用于将网络字节序(大端序)转换为主机字节序(小端序)。 |
uint16_t ntohs(uint16_t netshort); |
用于将网络字节序(大端序)转换为主机字节序(小端序)。 |
函数声明 | 函数功能 |
---|---|
double nan(const char *tagp); |
用于返回一个表示 NaN(非数值)的 double 类型数字 |
参数:
1 |
|
注意:
NaN
数字具有一些特殊的属性,例如与任何数字进行比较都会返回false
,因此在实际编程中需要特别小心处理NaN
的情况,避免出现异常结果
函数声明 | 函数功能 |
---|---|
int nanosleep(const struct timespec *req, struct timespec *rem); |
用于暂停当前进程的执行一段指定的时间。相比于 sleep() 函数,nanosleep() 函数可以精确地指定等待时间,以纳秒为单位。 |
参数:
timespec
结构体包含两个成员变量:tv_sec
表示等待时间的整数部分(秒),tv_nsec
表示等待时间的小数部分(纳秒)。如果 rem
参数不为 NULL
,则在函数返回时,未完成的等待时间将被存储在 rem
指向的 timespec
结构体中。1 |
|
在上述的程序中,
timespec
结构体变量 req
,用于指定等待时间。在本例中,我们将等待时间设置为 2
秒加上 5
毫秒。nanosleep()
函数,并传递 req
变量的地址作为第一个参数。如果函数执行成功(即完成了预定的等待时间),则返回值为 0
,否则返回 -1
。nanosleep()
是否成功完成。如果返回值为 0
,则表示函数已经完成了预定的等待时间;如果返回值为 -1
,则说明函数被信号中断。在实际编程中,我们还可以通过检查 errno
变量来获取更具体的错误信息。函数声明 | 函数功能 |
---|---|
double nearbyint(double x); |
用于将一个浮点数四舍五入到最接近的整数值(double) |
float nearbyintf(float x); |
用于将一个浮点数四舍五入到最接近的整数值(float) |
long double nearbyintl(long double x); |
用于将一个浮点数四舍五入到最接近的整数值(long double) |
1 |
|
注意:
nearbyint()
函数对于0.5
的情况具有特殊处理:如果要转换的数恰好与两个整数的距离相等,则按照偶数方向进行舍入(即选择更接近偶数的整数)。例如,如果要将2.5
转换为整数,那么将近似到最接近的偶数2
,而不是3
。这种舍入方式称为 “银行家舍入法” 或 “四舍六入五成双”。
函数声明 | 函数功能 |
---|---|
double nextafter(double x, double y); |
用于找出与给定的浮点数最接近的下一个浮点数(double) |
float nextafterf(float x, float y); |
用于找出与给定的浮点数最接近的下一个浮点数(float) |
long double nextafterl(long double x, long double y); |
用于找出与给定的浮点数最接近的下一个浮点数(long double) |
参数:
- y : 给定浮点数的目标值,表示前进方向。
返回值:
y
大于 x
,则向正无穷方向查找;y
小于 x
,则向负无穷方向查找;如果 y
等于 x
,则返回 y
。1 |
|
注意: 由于计算机内部存储浮点数的方式是有限制的,因此在进行浮点数计算时可能会存在误差。在实际编程中,我们应该特别小心处理这些情况,避免出现异常结果。
函数声明 | 函数功能 |
---|---|
double nexttoward(double x, long double y); |
用于找出与给定的浮点数最接近、并朝着指定方向的下一个浮点数(double) |
float nexttowardf(float x, long double y); |
用于找出与给定的浮点数最接近、并朝着指定方向的下一个浮点数(float) |
long double nexttowardl(long double x, long double y); |
用于找出与给定的浮点数最接近、并朝着指定方向的下一个浮点数(long double) |
参数:
返回值:
y
大于 x
,则向正无穷方向查找;y
小于 x
,则向负无穷方向查找;如果 y
等于 x
,则返回 y
。1 |
|
函数声明 | 函数功能 |
---|---|
locale_t newlocale(int category_mask, const char *locale, locale_t base); |
用于创建并返回一个新的本地化环境变量,以便在不同的本地化设置之间进行切换。 |
参数:
LC_ALL_MASK
:表示所有类别。LC_COLLATE_MASK
:表示字符串比较和排序规则。LC_CTYPE_MASK
:表示字符分类和转换规则。LC_MESSAGES_MASK
:表示本地化消息文本。LC_MONETARY_MASK
:表示货币格式。LC_NUMERIC_MASK
:表示数字格式。LC_TIME_MASK
:表示时间和日期格式。NULL
或空字符串,则使用当前系统默认的本地化设置。NULL
,则使用 LC_GLOBAL_LOCALE
。1 |
|
在上述程序中,
newlocale()
函数创建一个新的本地化环境变量 loc
,以便比较和排序德语字符串。strcoll_l()
函数来在新的本地化环境变量下比较两个字符串 str1
和 str2
。freelocale()
函数释放 loc
变量。注意: 在实际编程中应该特别注意本地化设置对字符处理、货币格式、时间格式等方面的影响,避免出现不必要的错误。
函数声明 | 函数功能 |
---|---|
int nftw(const char *dirpath, int (*fn)(const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf), int nopenfd, int flags); |
用于递归遍历指定目录下的所有文件和子目录,并对每个文件或目录执行指定操作。 |
参数:
struct stat
结构体指针,包含了当前文件的各种属性信息。FTW_F
:普通文件。FTW_D
:目录。FTW_DNR
:无法读取的目录。FTW_NS
:无法访问的文件(可能是因为权限问题)。FTW_SL
:符号链接。FTW_DP
:与 FTW_D 相同,但目录本身还未被访问。FTW_SLN
:符号链接,指向不存在的文件。struct FTW
结构体指针,包含了一些关于遍历状态的信息。FTW_CHDIR
:进入目录后更改工作目录。FTW_DEPTH
:深度优先遍历。FTW_MOUNT
:不跨越文件系统边界。FTW_PHYS
:不跟随符号链接。1 |
|
在上述的程序中,
print_file_info()
,用于打印每个文件或目录的路径和类型,并将计数器加一。nftw()
函数来递归遍历当前目录下的所有文件和子目录,并对每个文件或目录执行 print_file_info()
函数。注意: 在实际编程中应该特别注意文件访问权限等问题,以避免出现不必要的错误。
函数声明 | 函数功能 |
---|---|
int nice(int inc); |
它是一个系统调用,可将进程截止到当前用户的最大优先级减少指定的优先级,以更改进程的调度优先级。较高的 niceness 值意味着较低的优先级。 |
参数:
inc
的值为正数,则表示将进程的优先级降低;如果 inc
的值为负数,则表示将进程的优先级提高。通常情况下,只有具有 root
权限的进程才能将自己的优先级升高。1 |
|
在上述程序中,
nice(0)
函数输出当前进程的初始优先级;nice(10)
函数将进程的调度优先级降低 10
;注意: 由于
nice()
函数并不是标准C
库中的函数,因此在编译时需要传递-posix
参数或其他类似参数以启用POSIX
标准。在实际编程中应该特别注意优先级修改对进程正常运行的影响,以避免出现不必要的错误。
函数声明 | 函数功能 |
---|---|
char *nl_langinfo(nl_item item); |
它是一个 POSIX 标准函数,用于获取当前本地化环境下的语言环境信息。它可以返回一些与语言、货币、日期和时间格式等相关的信息。 |
参数:
ABDAY_*
:星期缩写名称(0 ~ 6 表示周日到周六)。DAY_*
:星期全称(0 ~ 6 表示周日到周六)。ABMON_*
:月份缩写名称(0 ~ 11 表示一月到十二月)。MON_*
:月份全称(0 ~ 11 表示一月到十二月)。AM_STR
:上午字符串。PM_STR
:下午字符串。D_FMT
:日期格式字符串。T_FMT
:时间格式字符串。ERA
:纪元字符串。ERA_D_T_FMT
:带日期和时间的纪元字符串。ERA_D_FMT
:仅带日期的纪元字符串。ERA_T_FMT
:仅带时间的纪元字符串。ALT_DIGITS
:非十进制数字字符。1 |
|
在上述的程序中,
nl_langinfo(T_FMT)
函数获取当前本地化环境下的时间格式字符串,并将其输出到终端。nl_langinfo(D_FMT)
函数获取当前本地化环境下的日期格式字符串,并将其输出到终端。注意: 在实际编程中应该特别注意处理不同本地化环境下信息的差异,以避免出现不必要的错误。
函数声明 | 函数功能 |
---|---|
long nrand48(unsigned short xsubi[3]); |
用于生成带有指定状态的随机数。它使用 48 位整数来表示随机数的状态,可以方便地切换不同的随机数生成器状态。 |
参数:
3
个 16
位无符号整数的数组,表示了当前随机数生成器的状态。如果想更改随机数生成器的状态,只需修改 xsubi
数组即可。1 |
|
在上述的程序中,
3
个 16
位无符号整数的数组 seed
,并将其用作随机数生成器的种子。srand48()
函数初始化随机数生成器,并使用 nrand48()
函数生成一个随机数,并将其输出到终端。注意: 由于
nrand48()
函数生成的是伪随机数,因此在实际使用时需要注意选择足够复杂的种子,并采取适当的加密措施以避免出现不必要的安全问题。
函数声明 | 函数功能 |
---|---|
uint32_t ntohl(uint32_t netlong); |
用于将网络字节序(大端序)转换为主机字节序(小端序)。 |
uint16_t ntohs(uint16_t netshort); |
用于将网络字节序(大端序)转换为主机字节序(小端序)。 |
参数:
32
位整数。16
位整数。1 |
|
注意: 在实际编程中应该特别注意不同平台之间的字节序差异,以避免出现不必要的错误。
函数声明 | 函数功能 |
---|---|
int mkdirat(int dirfd, const char *pathname, mode_t mode); |
它是一个 Linux 系统下的系统调用函数,用于在指定目录下创建新的子目录 |
int mkfifo(const char *pathname, mode_t mode); |
它是一个 Linux 系统下的系统调用函数,用于创建命名管道 |
int mkstemp(char *template); |
用于在磁盘上创建一个唯一的临时文件并打开它以进行读写 |
int mkdir(const char *pathname, mode_t mode); |
它是一个 Linux 系统下的系统调用函数,用于创建新目录 |
int mkdir(const char *pathname); |
它是在 Windows 系统下的系统调用函数,用于创建新目录 |
time_t mktime(struct tm *timeptr); |
用于将表示时间的结构体(struct tm)转换为对应的 Unix 时间戳 |
int mlock(const void *addr, size_t len); |
它是一个 Linux 系统下的系统调用函数,用于将指定内存区域锁定在物理内存中,防止其被交换到磁盘上 |
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); |
它是一个 Linux 系统下的系统调用函数,可以将一个文件或者设备映射到内存中,并返回指向该内存区域的指针 |
double modf(double x, double *iptr); |
用于将浮点数 value 拆分为其整数部分和小数部分(double) |
float modff(float value, float *iptr); |
用于将浮点数 value 拆分为其整数部分和小数部分(float) |
long double modfl(long double value, long double *iptr); |
用于将浮点数 value 拆分为其整数部分和小数部分(long double) |
int mount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags, const void *data); |
用于将文件系统挂载到指定的挂载点,并返回挂载点的文件描述符 |
int msync(void *addr, size_t length, int flags); |
用于将指定内存区域的数据同步到文件中 |
int munmap(void *addr, size_t length); |
用于取消内存映射区域,并释放与之相关的资源 |
int munlock(const void *addr, size_t len); |
用于将之前使用mlock()函数锁定的内存区域解锁,使其可被操作系统交换出去或被回收 |
函数声明 | 函数功能 |
---|---|
int mkdirat(int dirfd, const char *pathname, mode_t mode); |
它是一个 Linux 系统下的系统调用函数,用于在指定目录下创建新的子目录 |
参数:
AT_FDCWD
,则表示使用当前工作目录返回值:
0
;-1
,并设置错误码(errno
)。1 |
|
在上述的示例代码中,
/tmp
目录并获取其文件描述符 dirfd
;mkdirat()
函数,并将目录的文件描述符、要创建的新目录的名称和路径以及目录的权限模式作为参数传递给函数。如果函数调用成功,则新目录将在 /tmp
目录下创建。close()
函数关闭文件。注意:
mkdirat()
函数时,我们需要确保指定的父目录存在并具有适当的权限。函数声明 | 函数功能 |
---|---|
int mkfifo(const char *pathname, mode_t mode); |
它是一个 Linux 系统下的系统调用函数,用于创建命名管道 |
参数:
返回值:
0
;-1
,并设置错误码(errno
)。1 |
|
注意:
mkfifo()
函数时,我们需要确保指定的路径可被访问并且不存在同名的文件或目录。函数声明 | 函数功能 |
---|---|
int mkstemp(char *template); |
用于在磁盘上创建一个唯一的临时文件并打开它以进行读写 |
参数:
6
个连续 'X'
的字符串的指针,这些 'X'
将被替换为随机字符以创建唯一的文件名。例如,"/tmp/tempfile-XXXXXX"
将会被替换为类似 "/tmp/tempfile-5ZqYU2"
的唯一文件名。1 |
|
如上演示了,在 windows
下 创建临时文件:
temp_file_template
,它包含连续的 6
个 'X'
;mkstemp()
函数,并将指向 temp_file_template
的指针作为参数传递给函数。如果函数调用成功,则返回新创建文件的文件描述符,并将 temp_file_template
中的 'X'
替换为随机字符以形成唯一的文件名;printf()
函数,输出该临时文件的名称;close()
函数关闭临时文件。0
表示程序执行成功。注意: 在使用
mkstemp()
函数时,我们需要确保提供的模板字符串至少包含6
个'X'
,并且文件命名方式不能与现有文件冲突。
函数声明 | 函数功能 |
---|---|
int mkdir(const char *pathname, mode_t mode); |
它是一个 Linux 系统下的系统调用函数,用于创建新目录 |
int mkdir(const char *pathname); |
它是在 Windows 系统下的系统调用函数,用于创建新目录 |
参数:
返回值:
0
;-1
,并设置错误码(errno
)。1 |
|
1 |
|
Windows 下示例运行结果
函数声明 | 函数功能 |
---|---|
time_t mktime(struct tm *timeptr); |
用于将表示时间的结构体(struct tm)转换为对应的 Unix 时间戳 |
参数:
struct tm
结构体的指针,其中包含要转换为 Unix
时间戳的日期和时间信息返回值:
Unix
时间戳;-1
。1 |
|
在上面的示例代码中,
struct tm
结构体 my_time
,并将其初始化为 0
;1900
,月份应该从 0
开始计数减去 1
;mktime()
函数,并将指向 my_time
结构体的指针作为参数传递给函数。如果函数调用成功,则返回对应于输入时间的 Unix
时间戳。Unix
时间戳。注意:
mktime()
函数时,我们需要确保提供的 struct tm
结构体中的所有字段都已正确设置。mktime()
函数所使用的时区可能与系统默认的时区不同,所以在某些情况下,转换结果可能会有一定偏差。函数声明 | 函数功能 |
---|---|
int mlock(const void *addr, size_t len); |
它是一个 Linux 系统下的系统调用函数,用于将指定内存区域锁定在物理内存中,防止其被交换到磁盘上 |
参数:
返回值:
0
;-1
,并设置错误码(errno
)。1 |
|
在上述的示例代码中,
malloc()
函数分配了一个页大小的内存区域,并使用 memset()
函数将其清零;mlock()
函数,并将指向分配内存区域起始地址的指针以及内存区域的长度作为参数传递给函数。如果函数调用成功,则锁定分配的内存区域,防止其被交换到磁盘上;strncpy()
函数向上述的分配内存区域中写入字符串 "Hello world!"
,并通过 printf()
函数输出该字符串】;munlock()
函数解除内存区域的锁定;注意: 在使用
mlock()
函数时,我们需要确保指定的内存区域已正确分配并且足够大,以避免锁定错误的内存区域。
函数声明 | 函数功能 |
---|---|
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); |
它是一个 Linux 系统下的系统调用函数,可以将一个文件或者设备映射到内存中,并返回指向该内存区域的指针 |
参数:
NULL
,由内核选定PROT_NONE
: 区域不能被访问。PROT_READ
: 区域可被读取。PROT_WRITE
: 区域可被写入。PROT_EXEC
: 区域可被执行。MAP_SHARED
: 允许多个进程共享该映射区域,对映射区域所做的修改将反映到所有共享该区域的进程中。MAP_PRIVATE
: 该映射区域只允许当前进程进行访问,对映射区域所做的修改不会反映到其他进程中。MAP_FIXED
: 强制将映射区域放置在指定的地址处(如果该地址已经被占用,则会导致错误)。MAP_ANONYMOUS
: 创建一个匿名映射区域,不与任何文件关联。MAP_FILE
: 将映射区域与文件关联,需要指定文件描述符和偏移量。MAP_LOCKED
: 指示内核在物理存储器中锁定映射区域的页面,以确保在访问该区域时不会发生缺页中断。1 |
|
上述的示例代码,演示了如何使用 mmap()
函数将一个文件映射到内存中,并使用指针 ptr
访问这个映射区域 :
open()
函数打开文件 "example.txt"
,并检查是否成功打开。mmap()
函数将文件的前 4096
字节映射到内存中,同时指定保护方式为可读写(PROT_READ | PROT_WRITE
)以及共享属性(MAP_SHARED
)。strncpy()
函数向映射区域中写入字符串 "Hello world!"
,并通过 printf()
函数输出该字符串。munmap()
函数取消映射,并关闭文件。函数声明 | 函数功能 |
---|---|
double modf(double x, double *iptr); |
用于将浮点数 value 拆分为其整数部分和小数部分(double) |
float modff(float value, float *iptr); |
用于将浮点数 value 拆分为其整数部分和小数部分(float) |
long double modfl(long double value, long double *iptr); |
用于将浮点数 value 拆分为其整数部分和小数部分(long double) |
参数:
value
的整数部分1 |
|
函数声明 | 函数功能 |
---|---|
int mount(const char *source, const char *target, const char *filesystemtype, unsigned long mountflags, const void *data); |
用于将文件系统挂载到指定的挂载点,并返回挂载点的文件描述符 |
参数:
NULL
(表示根据 filesystemtype
参数自动选择默认源)1 |
|
在上面的示例代码中,我们调用 mount()
函数将 /dev/sda1
设备文件上的 ext4
文件系统挂载到 /mnt/usbdrive
目录下,并检查挂载操作是否成功。如果 mount()
函数返回值为 -1
,则表示挂载失败,通过 perror()
函数输出错误信息并返回 1
,程序异常结束;否则,打印 “File system mounted successfully!”
表示挂载成功,并返回 0
,程序正常结束。
函数声明 | 函数功能 |
---|---|
int msync(void *addr, size_t length, int flags); |
用于将指定内存区域的数据同步到文件中 |
参数:
cache
内容无效1 |
|
在上面的示例代码中,
open()
函数打开文件 "example.txt"
;mmap()
函数将文件的前 4096
字节映射到内存中;strncpy()
函数向映射区域中写入新的数据,并通过 msync()
函数将修改后的数据同步回磁盘文件;munmap()
函数解除映射并关闭文件。函数声明 | 函数功能 |
---|---|
int munmap(void *addr, size_t length); |
用于取消内存映射区域,并释放与之相关的资源 |
参数:
在调用 munmap()
函数后,操作系统将取消指定的内存映射,并回收相应的资源,包括虚拟地址空间和关联的物理内存页(如果存在)。此外,取消映射还可能导致未同步到磁盘文件中的修改数据丢失。
注意: 必须在对映射区域进行任何修改或者访问之前,先使用
mmap()
函数将文件映射到内存中;并在完成所有操作之后,再使用munmap()
函数解除映射。否则,可能会引发各种错误或者异常情况。
参见 7.2 的 演示示例,这里不再赘述
函数声明 | 函数功能 |
---|---|
int munlock(const void *addr, size_t len); |
用于将之前使用mlock()函数锁定的内存区域解锁,使其可被操作系统交换出去或被回收 |
参数:
返回值:
0
;-1
,并设置错误码(errno
)。注意: 只有拥有相应权限的进程才能解锁该内存区域。
参见 6.2 的 演示示例,这里不再赘述
函数声明 | 函数功能 |
---|---|
void *malloc(size_t size); |
用于动态分配内存 |
int mblen(const char *s, size_t n); |
检查多字节字符的长度 |
size_t mbrlen(const char *s, size_t n, mbstate_t *ps); |
检查多字节字符的长度 |
size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps); |
将多字节字符转换为宽字符 |
int mbsinit(const mbstate_t *ps); |
检查转换状态是否为起始状态 |
size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n); |
用于将多字节字符序列转换为宽字符序列。 |
size_t mbsrtowcs(wchar_t *dst, const char **src, size_t len, mbstate_t *ps); |
用于将多字节字符序列转换为宽字符序列,并在转换过程中自动更新 mbstate_t 转换状态结构体。 |
int mbtowc(wchar_t *restrict pwc, const char *restrict s, size_t n); |
用于将一个多字节字符 (Multibyte Character) 转换成一个宽字符 (Wide Character)。 |
void *memccpy(void *restrict dst, const void *restrict src, int c, size_t n); |
用于将内存块的内容复制到另一个内存块中,并在指定字符出现时停止复制。 |
void *memchr(const void *s, int c, size_t n); |
用于在某一内存块中查找指定字符的位置。 |
void *memcpy(void *dest, const void *src, size_t n); |
用于将源内存块中的 n 个字节复制到目标内存块中。 |
int memcmp(const void *s1, const void *s2, size_t n); |
用于比较两个内存块的内容是否相同。 |
void *memmove(void *dest, const void *src, size_t n); |
用于将源内存块中的 n 个字节复制到目标内存块中。与 memcpy() 函数不同的是,memmove() 函数在复制过程中会处理内存块重叠的情况。 |
void *memset(void *s, int c, size_t n); |
用于将一个内存块中的所有字节都设置为指定的值。 |
errno_t memset_s(void *s, rsize_t smax, int c, rsize_t n); |
C11 标准新增了一个名为 memset_s() 的安全版本函数。与 memset() 函数不同的是,memset_s() 函数会在设置内存块值时检查目标内存块大小,并防止缓冲区溢出、重叠等安全问题。 |
函数声明 | 函数功能 |
---|---|
void *malloc(size_t size); |
用于动态分配内存 |
参数:
返回值:
1 |
|
在上面的示例程序中,
str
,并将其初始化为 NULL
;malloc()
函数动态分配了 20 字节的内存空间,并将其赋值给 str
指针;strcpy()
函数将字符串 "Hello, world!"
复制到内存中,并使用 printf()
函数输出字符串;free()
函数释放了分配的内存空间。函数声明 | 函数功能 |
---|---|
int mblen(const char *s, size_t n); |
检查多字节字符的长度 |
参数:
注意: 如果 s
是空指针,则返回 0,表示不是多字节字符;否则,如果 n
不足以包含完整的多字节字符,则返回 -1,表示需要更多的输入;否则,返回多字节字符所需的字节数。
1 |
|
在上面的示例程序中,
setlocale()
函数设置本地化环境,以便正确处理多字节字符。str
;mblen()
函数检查第一个字符的长度,并将其保存到变量 len
中。函数声明 | 函数功能 |
---|---|
size_t mbrlen(const char *s, size_t n, mbstate_t *ps); |
检查多字节字符的长度 |
参数:
mbstate_t
结构体的指针注意: 如果 s
是空指针,则返回 0,表示不是多字节字符;否则,如果 n
不足以包含完整的多字节字符,则返回 (size_t)-2
,表示需要更多的输入;否则,如果 ps
是 NULL
,则使用默认转换状态;否则,将 ps
的值更新为已经转换的字符数,并返回多字节字符所需的字节数。
1 |
|
在上面的示例程序中,
setlocale()
函数设置本地化环境,以便正确处理多字节字符。str
;mbrlen()
函数检查第一个字符的长度,并将其保存到变量 len
中。函数声明 | 函数功能 |
---|---|
size_t mbrtowc(wchar_t *pwc, const char *s, size_t n, mbstate_t *ps); |
将多字节字符转换为宽字符 |
参数:
返回值:
(size_t)-1
。1 |
|
在上面的示例程序中,
setlocale()
函数设置本地化环境,以便正确处理多字节字符。str
;mbrtowc()
函数将第一个字符转换为宽字符,并将其保存到变量 wc
中。wprintf()
函数输出宽字符。注意: 在调用
mbrtowc()
函数之前,必须将mbstate_t
结构体的值初始化为0
。在 C99 标准中,可以使用大括号对结构体进行初始化,这会把结构体或数组的每个元素都初始化为默认值(0
或NULL
)。
函数声明 | 函数功能 |
---|---|
int mbsinit(const mbstate_t *ps); |
检查转换状态是否为起始状态 |
参数: |
mbstate_t
结构体的指针,表示要检查的转换状态。注意: 如果
ps
是空指针,则返回非零值(真),表示默认转换状态已经初始化;否则,如果ps
描述的转换状态是起始状态,则返回非零值(真);否则,返回0
(假)。
1 |
|
在上面的示例程序中,
str
和一个转换状态结构体 state
;mbsinit()
函数检查转换状态是否为起始状态;"The conversion state is initial."
。函数声明 | 函数功能 |
---|---|
size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n); |
用于将多字节字符序列转换为宽字符序列。 |
参数: |
返回值:
\0
;(size_t)-1
。1 |
|
在上面的示例程序中,我们首先定义了一个包含中文字符的字符串 str
和一个用于存储结果宽字符序列的缓冲区 wcbuf
。然后我们使用 mbstowcs()
函数将多字节字符序列转换为宽字符序列,并在控制台输出相应的信息。
注意: 在计算缓冲区大小时,必须将其指定为宽字符数(即
sizeof(wcbuf)/sizeof(wchar_t)
),而不是字节数或字符数。这是因为在Windows
等一些操作系统中,wchar_t
类型并不总是占用固定的字节数,而可能会根据编译器和平台而变化。
函数声明 | 函数功能 |
---|---|
size_t mbsrtowcs(wchar_t *dst, const char **src, size_t len, mbstate_t *ps); |
用于将多字节字符序列转换为宽字符序列,并在转换过程中自动更新 mbstate_t 转换状态结构体。 |
参数:
返回值:
\0
;(size_t)-1
。注意:
mbsrtowcs()
函数会自动更新转换状态结构体mbstate_t
,以记录上一次调用的状态并在下一次调用时继续使用。这使得mbsrtowcs()
函数适用于处理长的、包含部分多字节字符的字符串。它会自动识别和处理多字节字符序列中的部分字符,并等待更多的字节,直到可以完成转换为止。
1 |
|
函数声明 | 函数功能 |
---|---|
int mbtowc(wchar_t *restrict pwc, const char *restrict s, size_t n); |
用于将一个多字节字符 (Multibyte Character) 转换成一个宽字符 (Wide Character)。 |
参数:
返回值:
-1
;0
。1 |
|
函数声明 | 函数功能 |
---|---|
void *memccpy(void *restrict dst, const void *restrict src, int c, size_t n); |
用于将内存块的内容复制到另一个内存块中,并在指定字符出现时停止复制。 |
参数: |
返回值:
n
个字节中包含字符 c
,则返回指向字符 c
后面一个字节的指针;NULL
。1 |
|
函数声明 | 函数功能 |
---|---|
void *memchr(const void *s, int c, size_t n); |
用于在某一内存块中查找指定字符的位置。 |
参数:
n
个字节中查找指定字符1 |
|
在上述程序中,
str
和要查找的指定字符 ch
;memchr()
函数查找字符串 str
中是否包含指定字符 ch
;函数声明 | 函数功能 |
---|---|
void *memcpy(void *dest, const void *src, size_t n); |
用于将源内存块中的 n 个字节复制到目标内存块中。 |
参数:
1 |
|
注意: 在使用
memcpy()
函数进行内存复制时,目标内存块必须足够大,以容纳源内存块中的全部内容。否则,复制过程可能会导致访问非法内存空间,从而导致代码异常或崩溃。因此,在进行内存复制时,应该尽量避免超出目标内存块大小的范围。
函数声明 | 函数功能 |
---|---|
int memcmp(const void *s1, const void *s2, size_t n); |
用于比较两个内存块的内容是否相同。 |
参数:
注意: memcmp()
函数会逐一比较两个内存块中对应位置上的字节大小,直到找到差异或者比较完全部字节。
0
;s1
中该字节的值减去 s2
中该字节的值)。1 |
|
注意: 在比较两个内存块时,应该确保被比较的内存块中包含足够的字节,并且待比较的字节数不超过内存块大小,否则函数可能会出现异常行为。另外,由于返回值是有符号整数类型,因此在比较时应该将其强制转换为无符号整数类型,以避免出现不必要的错误。
函数声明 | 函数功能 |
---|---|
void *memmove(void *dest, const void *src, size_t n); |
用于将源内存块中的 n 个字节复制到目标内存块中。与 memcpy() 函数不同的是,memmove() 函数在复制过程中会处理内存块重叠的情况。 |
参数:
注意: memmove()
函数会将源内存块中的前 n
个字节复制到目标内存块中,并返回指向目标内存块起始地址的指针。
1 |
|
注意: 在使用 memmove()
函数进行内存复制时,目标内存块必须足够大,以容纳源内存块中的全部内容。否则,复制过程可能会导致访问非法内存空间,从而导致代码异常或崩溃。此外,由于 memmove()
函数的处理开销较大,因此在不涉及内存块重叠时,应该尽量使用 memcpy()
函数以提高效率。
函数声明 | 函数功能 |
---|---|
void *memset(void *s, int c, size_t n); |
用于将一个内存块中的所有字节都设置为指定的值。 |
errno_t memset_s(void *s, rsize_t smax, int c, rsize_t n); |
C11 标准新增了一个名为 memset_s() 的安全版本函数。与 memset() 函数不同的是,memset_s() 函数会在设置内存块值时检查目标内存块大小,并防止缓冲区溢出、重叠等安全问题。 |
memset 参数:
memset_s 参数:
1 |
|