C语言(02)——标准库函数大全(持续更新)
想要了解更多的C语言知识,可以订阅下面的专栏,里面也有很多品质好文:
打怪升级之路——C语言之路_ankleless的博客-CSDN博客
目录
还在持续更新中,以下是学习过程中遇到的一些库函数(排序不分先后):
1. printf函数——头文件<stdio.h>
语法形式:int printf(const char *format,......)
作用:在屏幕上输出对应的数据信息,printf的第一个参数是格式化字符串,可以在其中加入占位符,实现对后方参数的打印,占位符的数量决定了格式化字符串后面的参数数量
printf函数的返回值是成功打印的字符数量(包括所有字符,如字母、数字、空格、换行符\n等),类型为int。
注:一般情况下,printf不会打印 \0 ,若需要打印可以使用占位符%c或者'\0'进行单独打印,他打印出来不占视觉空间
示例:
#include <stdio.h>
int main()
{printf("Hello world");//执行程序,打印Hello worldreturn 0;
}
我们可以思考上述代码的运行结果,加深对printf函数的认知。
2. puts函数——头文件<stdio.h>
语法形式:int puts(const char *str)
作用:通过读取地址(字符指针)的方式来对内容进行打印(标准输出流),并再末尾追加一个换行符'\n'(自动换行)。有且仅有一个参数,这就决定了puts只能打印以\0结尾的字符串,不能在参数中加入占位符。他的返回值是一个非负整数,具体指取决于编译器
示例:
int main()
{puts("sahsagd");printf("%d", puts("sahsagd"));return 0;
}
3. fgets函数——头文件<stdio.h>
语法形式:char * fgets(char * str,int size, file * stream)
str 指向字符数组的指针,用于存储读取到的内容;
size为最大读取的字符数(包含字符串结束符\0) ;
stream是文件流指针。
作用:他是从指定流(一般为输入流stdin)中读取一行数据。
1. 当他遇到换行符 \n 时,fgets会将\n一同存入缓冲区,然后停止读取,尾部加入\0;
2. 当他读取到size - 1个数字是,由于最后一位需要存放\0,所以也会结束读取;
3. 当遇到文件末尾(EOF)或者读取错误时,会停止读取并返回NULL。
成功读取时,返回值为str(即存储字符串的数组地址),失败或者读到文件末尾EOF,返回NULL
注:若读取部分内容后遇到EOF,仍会返回str
示例:
int main()
{char str[10];fgets(str, 10, stdin);//可以读取空白符,但要注意读取停止的条件printf("%s", str);//打印输入的字符(注意空间限制)printf("\n");printf("%zd", strlen(str));//验证字符串长度和\0的存在return 0;
}
4. scanf函数——头文件<stdio.h>
语法形式:int scanf(const char *format,.....)
format 为格式控制字符串,由格式说明符(如%d、%s)和普通字符组成
...... 为可变参数列表,时存放读取结果的变量地址(需要&取地址符,除字符串数组外),需要注意输入的是变量名还是指针(地址)
作用:scanf是从标准输入流中读取字符,按照format字符串的格式进行解析;scanf()处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。
scanf的返回值是成功读取数据的个数(个数是非负的),如果没有读取任何项或者匹配失败,则返回0;如果在读取任何数据之前,发生了读取错误或者遇到文件末尾EOF,则返回EOF(-1)。
注:%s遇到空格停止读取,无法读取含空格的字符串(需用fgets替代),他从第一个非空白字符开始读取,并在末尾加上空字符\0;我们使用%[n]s来限制读取的字符串长度,但当读取的长度恰好等于数组长度时,会导致数组结尾不是\0,打印时会越界读取内存,这是不合理的写法:
%c不忽略空白字符,总是返回第一个字符,无论该字符是否为空格;
scanf读取除字符类型(%c)以外的数据时,遇到空白字符通常会停止读取。
示例:尝试输入10 sadgb .123e21 c,看输出的结果是什么
int main()
{int n;char arr[15];float k;char c;scanf("%d%s%f%c", &n, arr, &k, &c);printf("%d %s %f %c", n, arr, k, c);return 0;
}
5. pow函数——头文件<math.h>
语法形式:double pow(double base,double exponent)
base :底数,可以是任意实数;
exponent:指数,可以是任意实数。
注:当pow后的参数类型不是double时,会发生隐式类型转换。
作用:求base的exponent次幂,即一个数x^y的结果(返回值),类型为double;如果计算过程出现溢出等错误情况(如计算的数过大,超出范围),会根据具体实现返回特定的值(如HUGE_VAL表示正无穷大,-HUGE_VAL表示负无穷大,或者NaN表示非数(负数的开方)),并且可能设置全局变量errno来指示错误类型。
示例:
int main()
{printf("%lf", pow(2.2, 4));return 0;
}
6. time函数——头文件<time.h>
语法形式:time_t time(time_t * timer);
作用:获取当前的系统时间,返回从 UTC 时间 1970 年 1 月 1 日 00:00:00 到当前时刻的秒数(称为 “时间戳” 或 “Unix 时间”)。时间戳是计算机领域中用于表示时间的一种标准化方式,他通常指从某个固定的“时间起点”开始计算的时间间隔(通常以秒为单位)
timer 是一个指向time_t类型的指针。如果改指针不为NULL,函数会将获取到的时间戳同时存储到该指针指向的变量中(不能是无效地址),如果为NULL,则只通过返回值返回时间戳 。
示例:
time函数经常配合随机数一起使用
#include <stdio.h>
#include <time.h>int main() {time_t t1, t2;// 情况1:参数为NULL,只通过返回值获取时间戳t1 = time(NULL);printf("通过返回值获取:%lld\n", (long long)t1);// 情况2:参数为有效指针,同时存储到变量并返回time(&t2); // 等价于 t2 = time(&t2)printf("通过参数获取:%lld\n", (long long)t2);return 0;
}
7. strlen函数——头文件<string.h>
语法形式:size_t strlen( const char * str)
str 为需要计算的字符串的首地址,字符串需要以“\0”结尾,否则返回值是随机值
作用:计算字符串str 中从首地址开始到第一个"\0"之间的字符个数(不包含"\0"本身)
示例:
#include <stdio.h>
#include <string.h>int main() {char str1[] = "hello";char str2[] = "world\0extra"; // 遇到第一个'\0'就停止计数char str3[] = ""; // 空字符串char str4[] = {'a', 'b', 'c'}; // 注意:没有结束符'\0',会导致未定义行为printf("str1长度: %zu\n", strlen(str1)); // 输出:5printf("str2长度: %zu\n", strlen(str2)); // 输出:5(忽略'\0'后的内容)printf("str3长度: %zu\n", strlen(str3)); // 输出:0// printf("str4长度: %zu\n", strlen(str4)); // 危险!可能返回随机值或导致崩溃return 0;
}
8. rand函数——头文件<stdlib.h>
语法形式:int rand (void)
作用:返回值为0~RAND_MAX(int 类型),rand()生成的是伪随机数,其本质是通过一个数学算法(线性同余法)基于初始值(称为"种子")计算出的数值序列:
相同的种子会生成完全相同的随机数序列;
默认种子值为1;
要获取不同的随机序列,需要通过srand()函数设置不同的种子。
如果需要生成某特定区间范围的数字,如[0,100),则可以设置rand() % 100;利用取余的方法限制伪随机数区间。
示例:
#include <stdio.h>
#include <stdlib.h>int main() {// 生成5个随机数for (int i = 0; i < 5; i++) {printf("随机数 %d: %d\n", i+1, rand());}return 0;
}
9. srand函数——头文件<stdlib.h>
语法形式:void srand ( unsigned int seed)
作用:seed是一个无符号整数,即种子值,无返回值,他的作用是为rand()函数设置初始种子值,决定后续生成的伪随机数序列。
示例:
#include <stdio.h>
#include <stdlib.h>
#include <time.h> // 提供time()函数int main() {// 用当前时间戳作为种子(每次运行时间不同,种子不同)srand((unsigned int)time(NULL));// 生成5个随机数for (int i = 0; i < 5; i++) {printf("%d ", rand());}return 0;
}
10. abs函数——头文件<stdlib.h>
语法形式:int abs ( int n )
作用:计算整数n的绝对值,即:
若 n >= 0,返回n本身,若 n <= 0,返回-n。
示例:
#include <stdio.h>
#include <stdlib.h> // 包含abs()函数int main() {int a = 10;int b = -20;int c = 0;printf("abs(%d) = %d\n", a, abs(a)); // 输出:abs(10) = 10printf("abs(%d) = %d\n", b, abs(b)); // 输出:abs(-20) = 20printf("abs(%d) = %d\n", c, abs(c)); // 输出:abs(0) = 0return 0;
}
11. sqrt函数——头文件<math.h>
语法形式:double sqrt ( double x )
作用:计算非负实数x的平方根(即满足y^2 == x的非负实数y),参数double x是需要进行计算的非负实数(x >= 0),返回值也为double类型,注意函数参数和返回值的数据类型
示例:
#include <stdio.h>
#include <math.h> // 包含sqrt()函数int main() {double num1 = 25.0;double num2 = 2.0;double num3 = 0.0;printf("sqrt(%.1f) = %.1f\n", num1, sqrt(num1)); // 输出:sqrt(25.0) = 5.0printf("sqrt(%.1f) = %.6f\n", num2, sqrt(num2)); // 输出:sqrt(2.0) = 1.414214printf("sqrt(%.1f) = %.1f\n", num3, sqrt(num3)); // 输出:sqrt(0.0) = 0.0return 0;
}
12.qsort函数——头文件<stdlib.h>
语法形式:
void qsort (void * base, size_t num ,size_t size,int (*compar)(const void*,const void*))
base: 指向待排序数组的首地址(void *类型,可接受任意类型数组的指针);
num: 数组中元素的个数(size_t类型),实际应用中可以用sizeof操作符进行求得;
size: 每个元素的大小(单位:字节,size_t类型,通常用sizeof获取)
compar: 比较函数指针,用于定义排序规则,返回值决定元素的排序顺序:返回负数,第一个参数应该排在第二个参数前面(指左侧);返回0,两个参数相等;返回正数,第一个参数应排在第二个参数后面(指右侧)。
作用:qsort()基于快速排序算法实现,通过用户提供的比较函数compar确定元素之间的大小关系,从而对数组进行排序。由于使用void *指针和字节大小参数,他可以处理任何类型的数组,void *决定了他可以接受任意类型的指针。
关键是compar函数的设定。
示例:
#include <stdio.h>
#include <stdlib.h>// 比较两个整数:升序排列
int compare_int(const void *a, const void *b) {// 将void*转换为int*,再解引用获取值int num1 = *(const int *)a;int num2 = *(const int *)b;return num1 - num2; // 升序(num2 - num1 为降序)
}int main() {int arr[] = {5, 2, 9, 1, 5, 6};int n = sizeof(arr) / sizeof(arr[0]); // 元素个数qsort(arr, n, sizeof(int), compare_int);// 打印排序结果for (int i = 0; i < n; i++) {printf("%d ", arr[i]); // 输出:1 2 5 5 6 9}return 0;
}
13.
14.
15.
持续更新中