上:http://t.csdnimg.cn/qj5uA
目录
七. math.h
八. setjmp.h
九. signal.h
十. stdarg.h
十一.stddef.h
十二. stdio.h
十三. stdlib.
十四. string.h
十五. time.h
七. math.h
定义了各种数学函数和一个宏。
宏和函数描述
序号 | 宏 & 描述 |
---|---|
1 | HUGE_VAL 当函数的结果不可以表示为浮点数时。如果是因为结果的幅度太大以致于无法表示,则函数会设置 errno 为 ERANGE 来表示范围错误,并返回一个由宏 HUGE_VAL 或者它的否定(- HUGE_VAL)命名的一个特定的很大的值。 如果结果的幅度太小,则会返回零值。在这种情况下,error 可能会被设置为 ERANGE,也有可能不会被设置为 ERANGE。 |
序号 | 函数 & 描述 |
---|---|
1 | double acos(double x) 返回以弧度表示的 x 的反余弦。 |
2 | double asin(double x) 返回以弧度表示的 x 的反正弦。 |
3 | double atan(double x) 返回以弧度表示的 x 的反正切。 |
4 | double atan2(double y, double x) 返回以弧度表示的 y/x 的反正切。y 和 x 的值的符号决定了正确的象限。 |
5 | double cos(double x) 返回弧度角 x 的余弦。 |
6 | double cosh(double x) 返回 x 的双曲余弦。 |
7 | double sin(double x) 返回弧度角 x 的正弦。 |
8 | double sinh(double x) 返回 x 的双曲正弦。 |
9 | double tanh(double x) 返回 x 的双曲正切。 |
10 | double exp(double x) 返回 e 的 x 次幂的值。 |
11 | double frexp(double x, int *exponent) 把浮点数 x 分解成尾数和指数。返回值是尾数,并将指数存入 exponent 中。所得的值是 x = mantissa * 2 ^ exponent。 |
12 | double ldexp(double x, int exponent) 返回 x 乘以 2 的 exponent 次幂。 |
13 | double log(double x) 返回 x 的自然对数(基数为 e 的对数)。 |
14 | double log10(double x) 返回 x 的常用对数(基数为 10 的对数)。 |
15 | double modf(double x, double *integer) 返回值为小数部分(小数点后的部分),并设置 integer 为整数部分。 |
16 | double pow(double x, double y) 返回 x 的 y 次幂。 |
17 | double sqrt(double x) 返回 x 的平方根。 |
18 | double ceil(double x) 返回大于或等于 x 的最小的整数值。 |
19 | double fabs(double x) 返回 x 的绝对值。 |
20 | double floor(double x) 返回小于或等于 x 的最大的整数值。 |
21 | double fmod(double x, double y) 返回 x 除以 y 的余数。 |
源码截图:
例子:
源码:
#include <stdio.h>
#include <math.h>
int main() {
double a = 2.0;
double b = -2.0;
//打印a的平方根
printf("a的平方根 %f \n", sqrt(a));
//打印a的3次方根
printf("a的3次方根 %f \n", pow(a,3));
//打印b的绝对值
printf("打印b的绝对值 %f \n", fabs(b));
return 0;
}
八. setjmp.h
定义了宏 setjmp()、函数 longjmp() 和变量类型 jmp_buf,该变量类型会绕过正常的函数调用和返回规则。
源码
例子
1.不加跳转
2.加上跳转
源码:
#include <stdio.h>
#include <setjmp.h>
void a() {
printf("执行a函数");
}
void b() {
printf("执行b函数");
}
int main() {
jmp_buf env;
if (setjmp(env) == 0) {
// 这里是正常执行的代码
a();
longjmp(env, 0);
}
else {
// 这是从 longjmp 跳转回来后执行的代码
b();
}
return 0;
}
九. signal.h
调用函数和一些宏来处理程序执行期间报告的不同信号。
- 信号处理函数:通过
signal
函数可以注册信号处理函数,当指定的信号发生时,系统会调用相应的处理函数。 - 信号发送:可以使用
raise
函数向当前进程发送指定的信号。 - 信号屏蔽:可以使用
sigprocmask
函数来设置信号屏蔽字,以控制哪些信号被阻塞或不被阻塞。 - 信号等待:可以使用
sigsuspend
函数来等待一个或多个信号的发生。
源码截图
例子:
源码
#include <stdio.h>
#include <signal.h>
void sigusr1Handler(int sig) {
printf("收到!\n");
}
int main() {
printf("注册 SIGINT 信号的处理函数.\n");
// 注册 SIGINT 信号的处理函数
signal(SIGINT, sigusr1Handler);
printf("下面信号发送.\n");
raise(SIGINT);
// while (1) {}
return 0;
}
十. stdarg.h
主要用于实现可变参数列表的相关操作。
宏描述
序号 | 宏 & 描述 |
---|---|
1 | void va_start(va_list ap, last_arg) 这个宏初始化 ap 变量,它与 va_arg 和 va_end 宏是一起使用的。last_arg 是最后一个传递给函数的已知的固定参数,即省略号之前的参数。 |
2 | type va_arg(va_list ap, type) 这个宏检索函数参数列表中类型为 type 的下一个参数。 |
3 | void va_end(va_list ap) 这个宏允许使用了 va_start 宏的带有可变参数的函数返回。如果在从函数返回之前没有调用 va_end,则结果为未定义。 |
源码截图;
例子:
源码:
#include <stdio.h>
#include <stdarg.h>
void print_args(int count, ...) {
va_list args;
va_start(args, count);
for (int i = 0; i < count; i++) {
int num = va_arg(args, int);
printf("Arg %d: %d\n", i, num);
}
va_end(args);
}
int main() {
print_args(3, 10, 20, 30);
return 0;
}
十一.stddef.h
包含了一些通用的定义和类型声明。
变量描述
序号 | 变量 & 描述 |
---|---|
1 | ptrdiff_t 这是有符号整数类型,它是两个指针相减的结果。 |
2 | size_t 这是无符号整数类型,它是 sizeof 关键字的结果。 |
3 | wchar_t 这是一个宽字符常量大小的整数类型。 |
源码截图
例子:
源码
#include <stdio.h>
#include <stddef.h>
int main() {
size_t arraySize = 10;
printf("Size: %zu\n", arraySize);
return 0;
}
十二. stdio.h
标准输入输出头文件)是 C 语言中非常重要的头文件,包含了许多与标准输入、输出操作相关的函数和宏定义。
一些主要的函数和操作包括:
printf()
:格式化输出数据到标准输出(通常是屏幕)。scanf()
:从标准输入(通常是键盘)读取格式化的数据。fopen()
、fclose()
:用于文件的打开和关闭操作。fprintf()
、fscanf()
:用于对文件进行格式化输入输出。putchar()
:输出一个字符。getchar()
:获取一个字符。
源码:
例子:
源码:
#include <stdio.h>
int main() {
printf("Hello, World!\n");
printf("You entered: %d\n", 1);
return 0;
}
十三. stdlib.
包含了一系列实用的函数和宏。
以下是一些常见的用途:
malloc()
和free()
用于动态内存分配和释放。atoi()
用于将字符串转换为整数。rand()
用于生成随机数。exit()
用于终止程序。
源码:
例子:
源码:
#include <stdio.h>
#include <stdlib.h>
int main() {
int* ptr = (int*)malloc(sizeof(int));
if (ptr) {
*ptr = 42;
printf("Value at allocated memory: %d\n", *ptr);
free(ptr);
}
int num = atoi("123");
printf("Converted integer: %d\n", num);
return 0;
}
十四. string.h
包含了很多用于字符串操作的函数.
以下是一些常见的:
strcpy()
:用于复制字符串。strncpy()
:指定长度的字符串复制。strcat()
:连接两个字符串。strncat()
:指定长度的字符串连接。strcmp()
:比较两个字符串。strncmp()
:指定长度的字符串比较。strlen()
:获取字符串的长度。
源码
例子:
源码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello";
char dst[10];
strcpy(dst, src);
printf("Copied string: %s\n", dst);
char str1[] = "Apple";
char str2[] = "ApplePie";
if (strcmp(str1, str2) == 0) {
printf("Strings are equal\n");
}
else {
printf("Strings are not equal\n");
}
return 0;
}
十五. time.h
主要用于时间相关的操作。
以下是一些常见的用法:
time_t
类型,通常用于表示时间。time()
函数获取当前时间(以秒为单位)。ctime()
函数将时间转换为字符串表示。localtime()
函数将时间转换为本地时间的结构体表示。
源码截图
例子:
源码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
int main() {
time_t now = time(NULL);
printf("Current time in seconds: %ld\n", now);
char* timeStr = ctime(&now);
printf("Current time as string: %s", timeStr);
struct tm* localTime = localtime(&now);
printf("Year: %d\n", localTime->tm_year + 1900);
return 0;
}
ps:需要在年份上加上1900
,在月份上加上1
,这是因为localtime
函数返回的结构体中的年份和月份是从1900
年和1
月开始计数的。