想要了解更多的C语言知识,可以订阅下面的专栏,里面也有很多品质好文:
打怪升级之路------C语言之路_ankleless的博客-CSDN博客
目录
[1. printf函数------头文件](#1. printf函数——头文件)
[2. puts函数------头文件](#2. puts函数——头文件)
[3. fgets函数------头文件](#3. fgets函数——头文件)
[4. scanf函数------头文件](#4. scanf函数——头文件)
[5. pow函数------头文件](#5. pow函数——头文件)
[6. time函数------头文件](#6. time函数——头文件)
[7. strlen函数------头文件](#7. strlen函数——头文件)
[8. rand函数------头文件](#8. rand函数——头文件)
[9. srand函数------头文件](#9. srand函数——头文件)
[10. abs函数------头文件](#10. abs函数——头文件)
[11. sqrt函数------头文件](#11. sqrt函数——头文件)
还在持续更新中,以下是学习过程中遇到的一些库函数(排序不分先后):
1. printf函数------头文件<stdio.h>
**语法形式:**int printf(const char *format,......)
**作用:**在屏幕上输出对应的数据信息,printf的第一个参数是格式化字符串,可以在其中加入占位符,实现对后方参数的打印,占位符的数量决定了格式化字符串后面的参数数量
printf函数的返回值是成功打印的字符数量(包括所有字符,如字母、数字、空格、换行符\n等),类型为int。
注 :一般情况下,printf不会打印 \0 ,若需要打印可以使用占位符**%c** 或者**'\0'** 进行单独打印,他打印出来不占视觉空间
示例:
cpp
#include <stdio.h>
int main()
{
printf("Hello world");//执行程序,打印Hello world
return 0;
}
我们可以思考上述代码的运行结果,加深对printf函数的认知。
2. puts函数------头文件<stdio.h>
**语法形式:**int puts(const char *str)
作用: 通过读取地址(字符指针)的方式来对内容进行打印(标准输出流),并再末尾追加一个换行符'\n'(自动换行 )。有且仅有 一个参数,这就决定了puts只能打印以\0结尾的字符串,不能 在参数中加入占位符。他的返回值是一个非负整数,具体指取决于编译器
示例:
cpp
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)中读取一行数据。
-
当他遇到换行符 \n 时,fgets会将\n一同存入缓冲区,然后停止读取,尾部加入\0;
-
当他读取到size - 1个数字是,由于最后一位需要存放\0,所以也会结束读取;
-
当遇到文件末尾(EOF)或者读取错误时,会停止读取并返回NULL。
成功读取时,返回值为str(即存储字符串的数组地址),失败或者读到文件末尾EOF,返回NULL
注:若读取部分内容后遇到EOF,仍会返回str
示例:
cpp
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,看输出的结果是什么
cpp
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来指示错误类型。
示例:
cpp
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函数经常配合随机数一起使用
cpp
#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"本身)
示例:
cpp
#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)); // 输出:5
printf("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;利用取余的方法限制伪随机数区间。
示例:
cpp
#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()函数设置初始种子值,决定后续生成的伪随机数序列。
示例:
cpp
#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。
示例:
cpp
#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) = 10
printf("abs(%d) = %d\n", b, abs(b)); // 输出:abs(-20) = 20
printf("abs(%d) = %d\n", c, abs(c)); // 输出:abs(0) = 0
return 0;
}
11. sqrt函数------头文件<math.h>
**语法形式:**double sqrt ( double x )
作用: 计算非负实数x的平方根(即满足y^2 == x的非负实数y),参数double x是需要进行计算的非负实数(x >= 0),返回值也为double类型,注意函数参数 和返回值的数据类型
示例:
cpp
#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.0
printf("sqrt(%.1f) = %.6f\n", num2, sqrt(num2)); // 输出:sqrt(2.0) = 1.414214
printf("sqrt(%.1f) = %.1f\n", num3, sqrt(num3)); // 输出:sqrt(0.0) = 0.0
return 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函数的设定。
示例:
cpp
#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;
}
持续更新中