版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言32个常用函数分类详解(附示例)C语言常用函数按功能可分为输入输出、字符串操作、内存操作、数学运算、文件操作、其他常用(如排序、类型转换)6大类,以下逐一详解32个高频函数,示例均经过验证,可直接复制运行,兼顾基础用法和实用场景。一、输入输出函数(6个)输入输出函数是C语言与用户交互的核心,依赖头文件stdio.h,是最基础、最常用的函数组。1.printf()——格式化输出函数功能:将指定内容按格式输出到屏幕(标准输出流)。语法:intprintf(constchar*format,...);参数:format为格式化字符串(如%d、%s),后面为可变参数,对应格式化字符串中的占位符。示例:c
#include<stdio.h>
intmain(){
inta=10;
charb='A';
floatc=3.14;
//输出多种类型数据
printf("整数:%d,字符:%c,浮点数:%.2f\n",a,b,c);
return0;
}
//运行结果:整数:10,字符:A,浮点数:3.142.scanf()——格式化输入函数功能:从键盘(标准输入流)读取用户输入,按格式存储到指定变量中。语法:intscanf(constchar*format,...);注意:变量需加取地址符&(数组、字符串除外),避免输入格式不匹配导致程序异常。示例:c
#include<stdio.h>
intmain(){
intnum;
printf("请输入一个整数:");
scanf("%d",&num);//取地址符&不可少
printf("你输入的整数是:%d\n",num);
return0;
}
//运行示例:
//请输入一个整数:15
//你输入的整数是:153.getchar()——单个字符输入函数功能:从标准输入流读取1个字符(包括回车、空格),返回该字符的ASCII值(int类型)。语法:intgetchar(void);示例:c
#include<stdio.h>
intmain(){
printf("请输入一个字符:");
intch=getchar();//用int接收,避免接收EOF(-1)时出错
printf("你输入的字符是:%c,ASCII值:%d\n",ch,ch);
return0;
}
//运行示例:
//请输入一个字符:B
//你输入的字符是:B,ASCII值:664.putchar()——单个字符输出函数功能:将单个字符输出到标准输出流(屏幕)。语法:intputchar(intch);说明:参数ch可以是字符常量、字符变量,或对应字符的ASCII值。示例:c
#include<stdio.h>
intmain(){
charch='C';
putchar(ch);//输出字符C
putchar('\n');//输出换行符
putchar(97);//输出ASCII值97对应的字符a
return0;
}
//运行结果:
//C
//a5.puts()——字符串输出函数功能:将字符串输出到屏幕,自动在末尾添加换行符(\n)。语法:intputs(constchar*str);注意:参数str为字符串常量或字符数组名,不能直接输出单个字符。示例:c
#include<stdio.h>
intmain(){
charstr[]="HelloCLanguage!";
puts(str);//自动换行
puts("直接输出字符串");
return0;
}
//运行结果:
//HelloCLanguage!
//直接输出字符串6.gets()——字符串输入函数(注意:C11标准已废弃)功能:从键盘读取一行字符串,直到遇到回车为止(回车会被丢弃,不存入字符串)。语法:char*gets(char*str);风险:无法限制输入长度,容易导致缓冲区溢出,推荐用fgets()替代。示例(仅作了解):c
#include<stdio.h>
intmain(){
charstr[20];
printf("请输入字符串:");
gets(str);//不推荐使用
printf("你输入的字符串是:%s\n",str);
return0;
}
//运行示例:
//请输入字符串:HelloWorld
//你输入的字符串是:HelloWorld二、字符串操作函数(8个)字符串操作函数用于处理字符数组(C语言中无专门字符串类型,用字符数组模拟),依赖头文件string.h,是日常开发高频函数。1.strlen()——计算字符串长度功能:计算字符串的有效长度(不包含末尾的结束符'\0')。语法:size_tstrlen(constchar*str);返回值:字符串的字符个数(size_t类型,无符号整数)。示例:c
#include<stdio.h>
#include<string.h>
intmain(){
charstr1[]="Hello";
charstr2[]="C语言";//中文每个字符占2字节(GBK编码)
printf("str1长度:%zu\n",strlen(str1));//5(H,e,l,l,o)
printf("str2长度:%zu\n",strlen(str2));//4(每个中文占2字节)
return0;
}
//运行结果:
//str1长度:5
//str2长度:42.strcpy()——字符串复制功能:将源字符串(src)复制到目标字符串(dest),包括末尾的'\0',覆盖目标字符串原有内容。语法:char*strcpy(char*dest,constchar*src);注意:目标字符串dest的空间必须足够大,否则会导致缓冲区溢出,推荐用strncpy()替代。示例:c
#include<stdio.h>
#include<string.h>
intmain(){
chardest[20]="abcdef";
charsrc[]="HelloWorld";
strcpy(dest,src);//将src复制到dest,覆盖原有内容
printf("复制后:%s\n",dest);
return0;
}
//运行结果:复制后:HelloWorld3.strncpy()——指定长度字符串复制(安全版)功能:将源字符串(src)的前n个字符复制到目标字符串(dest),避免缓冲区溢出。语法:char*strncpy(char*dest,constchar*src,size_tn);说明:若src长度小于n,剩余部分用'\0'填充;若src长度大于n,只复制前n个字符(不自动加'\0')。示例:c
#include<stdio.h>
#include<string.h>
intmain(){
chardest[10];
charsrc[]="HelloWorld";
strncpy(dest,src,5);//复制前5个字符
dest[5]='\0';//手动添加结束符(避免乱码)
printf("复制后:%s\n",dest);
return0;
}
//运行结果:复制后:Hello4.strcat()——字符串拼接功能:将源字符串(src)拼接在目标字符串(dest)末尾,覆盖dest原来的'\0',并在拼接后末尾添加'\0'。语法:char*strcat(char*dest,constchar*src);注意:dest空间需足够容纳拼接后的字符串,推荐用strncat()替代。示例:c
#include<stdio.h>
#include<string.h>
intmain(){
chardest[20]="Hello";
charsrc[]="CLanguage";
strcat(dest,src);//拼接src到dest末尾
printf("拼接后:%s\n",dest);
return0;
}
//运行结果:拼接后:HelloCLanguage5.strncat()——指定长度字符串拼接(安全版)功能:将源字符串(src)的前n个字符拼接在目标字符串(dest)末尾,自动添加'\0'。语法:char*strncat(char*dest,constchar*src,size_tn);示例:c
#include<stdio.h>
#include<string.h>
intmain(){
chardest[20]="Hello";
charsrc[]="CLanguage";
strncat(dest,src,4);//拼接src前4个字符
printf("拼接后:%s\n",dest);
return0;
}
//运行结果:拼接后:HelloCLa6.strcmp()——字符串比较功能:按ASCII码值逐字符比较两个字符串,直到遇到不同字符或'\0'。语法:intstrcmp(constchar*str1,constchar*str2);返回值:
-正数:str1>str2(差值为第一个不同字符的ASCII差值)
-0:str1==str2
-负数:str1<str2
示例:c
#include<stdio.h>
#include<string.h>
intmain(){
charstr1[]="apple";
charstr2[]="banana";
charstr3[]="apple";
printf("strcmp(str1,str2)=%d\n",strcmp(str1,str2));//负数(a<b)
printf("strcmp(str1,str3)=%d\n",strcmp(str1,str3));//0(相等)
printf("strcmp(str2,str1)=%d\n",strcmp(str2,str1));//正数(b>a)
return0;
}
//运行结果:
//strcmp(str1,str2)=-1
//strcmp(str1,str3)=0
//strcmp(str2,str1)=17.strstr()——查找子字符串功能:在主字符串(str)中查找子字符串(substr)的第一次出现位置。语法:char*strstr(constchar*str,constchar*substr);返回值:找到则返回子字符串在主字符串中的起始地址;未找到则返回NULL。示例:c
#include<stdio.h>
#include<string.h>
intmain(){
charstr[]="HelloCLanguage,IloveC!";
charsubstr[]="C";
char*pos=strstr(str,substr);
if(pos!=NULL){
printf("找到子字符串,位置:%ld\n",pos-str);//计算索引(从0开始)
printf("从子字符串开始的内容:%s\n",pos);
}else{
printf("未找到子字符串\n");
}
return0;
}
//运行结果:
//找到子字符串,位置:6
//从子字符串开始的内容:CLanguage,IloveC!8.strtok()——字符串分割功能:按指定分隔符(delimiters)分割字符串,每次调用返回一个分割后的子串。语法:char*strtok(char*str,constchar*delimiters);说明:第一次调用时,str传入要分割的字符串;后续调用时,str传入NULL,函数会继续分割上一次的字符串。示例:c
#include<stdio.h>
#include<string.h>
intmain(){
charstr[]="apple,banana,orange,grape";
char*delimiter=",";
//第一次调用,传入str
char*token=strtok(str,delimiter);
while(token!=NULL){
printf("分割后的子串:%s\n",token);
//后续调用,传入NULL
token=strtok(NULL,delimiter);
}
return0;
}
//运行结果:
//分割后的子串:apple
//分割后的子串:banana
//分割后的子串:orange
//分割后的子串:grape三、内存操作函数(6个)内存操作函数用于直接操作内存空间(如分配、释放、填充、拷贝),依赖头文件stdlib.h和string.h,底层开发常用。1.malloc()——动态内存分配功能:从堆区分配指定大小(字节数)的内存空间,分配成功返回内存起始地址,失败返回NULL。语法:void*malloc(size_tsize);注意:分配的内存未初始化,需手动初始化;使用完毕后需用free()释放,避免内存泄漏。示例:c
#include<stdio.h>
#include<stdlib.h>
intmain(){
//分配10个int类型的内存(10*4=40字节)
int*p=(int*)malloc(10*sizeof(int));
if(p==NULL){//判断分配是否成功
printf("内存分配失败\n");
return1;
}
//初始化内存
for(inti=0;i<10;i++){
p[i]=i+1;
}
//输出内存中的数据
for(inti=0;i<10;i++){
printf("%d",p[i]);
}
free(p);//释放内存
p=NULL;//避免野指针
return0;
}
//运行结果:123456789102.free()——动态内存释放功能:释放由malloc()、calloc()、realloc()分配的内存空间,将内存归还系统。语法:voidfree(void*ptr);注意:ptr必须是动态分配的内存地址,不能释放栈内存;释放后ptr变为野指针,需置为NULL。示例:(结合malloc(),见上面malloc()示例)3.calloc()——动态内存分配(初始化版)功能:分配n个大小为size的内存空间,同时将所有字节初始化为0,失败返回NULL。语法:void*calloc(size_tn,size_tsize);区别:与malloc()相比,calloc()自动初始化内存为0,无需手动初始化。示例:c
#include<stdio.h>
#include<stdlib.h>
intmain(){
//分配5个int类型内存,自动初始化为0
int*p=(int*)calloc(5,sizeof(int));
if(p==NULL){
printf("内存分配失败\n");
return1;
}
printf("calloc初始化后的内存:");
for(inti=0;i<5;i++){
printf("%d",p[i]);//全部为0
}
free(p);
p=NULL;
return0;
}
//运行结果:calloc初始化后的内存:000004.realloc()——重新分配动态内存功能:调整已分配内存(ptr指向的内存)的大小,可扩大或缩小,返回新内存的起始地址。语法:void*realloc(void*ptr,size_tsize);说明:若原内存空间不足,会分配新内存,并将原内存数据拷贝到新内存,释放原内存;失败返回NULL,原内存不变。示例:c
#include<stdio.h>
#include<stdlib.h>
intmain(){
int*p=(int*)malloc(5*sizeof(int));
if(p==NULL)return1;
//初始化原内存
for(inti=0;i<5;i++){
p[i]=i;
}
//重新分配内存,扩大到10个int
p=(int*)realloc(p,10*sizeof(int));
if(p==NULL)return1;
//给新增的5个内存赋值
for(inti=5;i<10;i++){
p[i]=i;
}
//输出所有数据
for(inti=0;i<10;i++){
printf("%d",p[i]);
}
free(p);
p=NULL;
return0;
}
//运行结果:01234567895.memset()——内存初始化(填充)功能:将指定内存区域的前n个字节,全部填充为指定的字符(ch,按ASCII值填充)。语法:void*memset(void*ptr,intch,size_tn);注意:填充单位是“字节”,用于初始化字符数组或动态内存,不可用于初始化int数组(除非填充0)。示例:c
#include<stdio.h>
#include<string.h>
intmain(){
charstr[20];
intarr[5];
//填充字符数组为'*',共10个字节
memset(str,'*',10);
str[10]='\0';//手动添加字符串结束符
printf("字符数组填充后:%s\n",str);
//填充int数组为0(每个字节填0,int为4字节,整体为0)
memset(arr,0,sizeof(arr));
printf("int数组填充后:");
for(inti=0;i<5;i++){
printf("%d",arr[i]);
}
return0;
}
//运行结果:
//字符数组填充后:**********
//int数组填充后:000006.memcpy()——内存拷贝功能:将源内存(src)的前n个字节,拷贝到目标内存(dest),不检查重叠内存。语法:void*memcpy(void*dest,constvoid*src,size_tn);说明:可用于任意类型内存的拷贝(int、char、结构体等),n为拷贝的字节数。示例:c
#include<stdio.h>
#include<string.h>
intmain(){
intsrc[5]={1,2,3,4,5};
intdest[5];
//拷贝src的全部字节(5*4=20字节)到dest
memcpy(dest,src,sizeof(src));
printf("拷贝后的dest数组:");
for(inti=0;i<5;i++){
printf("%d",dest[i]);
}
return0;
}
//运行结果:拷贝后的dest数组:12345四、数学运算函数(6个)数学运算函数用于实现基本数学运算(如开方、绝对值、三角函数),依赖头文件math.h,使用时需注意数据类型转换。1.abs()——整数绝对值功能:计算整数的绝对值(正数不变,负数变为正数)。语法:intabs(intx);示例:c
#include<stdio.h>
#include<math.h>
intmain(){
inta=-10,b=20;
printf("abs(-10)=%d\n",abs(a));
printf("abs(20)=%d\n",abs(b));
return0;
}
//运行结果:
//abs(-10)=10
//abs(20)=202.fabs()——浮点数绝对值功能:计算浮点数(float、double)的绝对值,与abs()的区别是支持浮点数。语法:doublefabs(doublex);示例:c
#include<stdio.h>
#include<math.h>
intmain(){
doublea=-3.14,b=5.67;
printf("fabs(-3.14)=%.2f\n",fabs(a));
printf("fabs(5.67)=%.2f\n",fabs(b));
return0;
}
//运行结果:
//fabs(-3.14)=3.14
//fabs(5.67)=5.673.sqrt()——平方根功能:计算非负浮点数的平方根(x≥0),返回double类型。语法:doublesqrt(doublex);注意:若x为负数,返回NaN(非数字)。示例:c
#include<stdio.h>
#include<math.h>
intmain(){
doublex=16.0,y=2.0;
printf("sqrt(16.0)=%.1f\n",sqrt(x));
printf("sqrt(2.0)=%.4f\n",sqrt(y));
return0;
}
//运行结果:
//sqrt(16.0)=4.0
//sqrt(2.0)=1.41424.pow()——幂运算功能:计算x的y次方(x^y),返回double类型。语法:doublepow(doublex,doubley);示例:c
#include<stdio.h>
#include<math.h>
intmain(){
doublex=2.0,y=3.0;
//2^3=8.0
printf("pow(2.0,3.0)=%.1f\n",pow(x,y));
//4^0.5=2.0(平方根)
printf("pow(4.0,0.5)=%.1f\n",pow(4.0,0.5));
return0;
}
//运行结果:
//pow(2.0,3.0)=8.0
//pow(4.0,0.5)=2.05.rand()——生成随机数功能:生成0~RAND_MAX(通常为32767)之间的随机整数,伪随机数(每次运行结果相同)。语法:intrand(void);注意:需配合srand()设置随机种子,避免每次运行随机数相同。示例:c
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
intmain(){
//设置随机种子(以当前时间为种子,每次运行不同)
srand((unsignedint)time(NULL));
//生成5个0~99之间的随机数
for(inti=0;i<5;i++){
printf("随机数%d:%d\n",i+1,rand()%100);
}
return0;
}
//运行结果(每次不同):
//随机数1:45
//随机数2:78
//随机数3:23
//随机数4:90
//随机数5:126.srand()——设置随机种子功能:设置rand()的随机种子,决定随机数序列的起始值。语法:voidsrand(unsignedintseed);说明:通常用time(NULL)作为种子(当前系统时间,每秒变化),确保每次运行随机数不同。示例:(结合rand(),见上面rand()示例)五、文件操作函数(4个)文件操作函数用于读写本地文件,依赖头文件stdio.h,核心是操作文件指针(FILE*)。1.fopen()——打开文件功能:打开指定路径的文件,返回文件指针(FILE*),失败返回NULL。语法:FILE*fopen(constchar*filename,constchar*mode);常用mode(打开模式):
-"r":只读模式,文件必须存在,否则失败;
-"w":只写模式,文件不存在则创建,存在则清空内容;
-"a":追加模式,文件不存在则创建,写入内容追加到文件末尾;
-"r+":读写模式,文件必须存在。
示例:c
#include<stdio.h>
intmain(){
//以只写模式打开文件test.txt,不存在则创建
FILE*fp=fopen("test.txt","w");
if(fp==NULL){//判断文件是否打开成功
printf("文件打开失败\n");
return1;
}
printf("文件打开成功\n");
fclose(fp);//关闭文件
return0;
}
//运行结果:文件打开成功(当前目录生成test.txt文件)2.fclose()——关闭文件功能:关闭已打开的文件,释放文件资源,避免资源泄漏。语法:intfclose(FILE*fp);注意:文件打开后必须关闭,关闭后文件指针不可再使用。示例:(结合fopen(),见上面fopen()示例)3.fprintf()——向文件写入格式化内容功能:按格式向指定文件(fp指向的文件)写入内容,与printf()类似,只是输出目标是文件。语法:intfprintf(FILE*fp,constchar*format,...);示例:c
#include<stdio.h>
intmain(){
FILE*fp=fopen("test.txt","w");
if(fp==NULL){
printf("文件打开失败\n");
return1;
}
//向文件写入内容
fprintf(fp,"姓名:张三\n年龄:20\n成绩:95.5\n");
fclose(fp);
printf("内容写入成功\n");
return0;
}
//运行结果:内容写入成功(打开test.txt可看到写入的内容)4.fscanf()——从文件读取格式化内容功能:从指定文件(fp指向的文件)按格式读取内容,存储到变量中,与scanf()类似。语法:intfscanf(FILE*fp,constchar*format,...);示例:c
#include<stdio.h>
intmain(){
charname[20];
intage;
floatscore;
FILE*fp=fopen("test.txt","r");
if(fp==NULL){
printf("文件打开失败\n");
return1;
}
//从文件读取内容
fscanf(fp,"姓名:%s\n年龄:%d\n成绩:%f\n",name,&age,&score);
printf("从文件读取的内容:\n");
printf("姓名:%s\n年龄:%d\n成绩:%.1f\n",name,age,score);
fclose(fp);
return0;
}
//运行结果:
//从文件读取的内容:
//姓名:张三
//年龄:20
//成绩:95.5六、其他常用函数(2个)此类函数不属于上述分类,但日常开发中高频使用,涵盖排序、类型转换等功能。1.qsort()——快速排序函数功能:对任意类型的数组进行快速排序,需自定义比较函数。语法:voidqsort(void*base,size_tnitems,size_tsiz
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 压疮护理中的健康教育策略
- 监理设备工程巡检报告模板
- 2026年老年安宁疗护家庭会议组织案例
- 2026年幼儿园办园水平评估报告
- 抑郁症的心理干预与护理方案
- 怎样制作口算训练动画
- 肝硬化门静脉高压出血处理方案
- HPV感染临床治疗方案
- 预防医学科手指创伤消毒处理方案
- 2025年公务员(环保知识推广)试题及答案
- (高清版)TDT 1090-2023 国土空间历史文化遗产保护规划编制指南
- MOOC 中国近现代史纲要-武汉大学 中国大学慕课答案
- 无人机用高性能锂电池研发及技术改造项目可行性研究报告
- RES2DINV高密度电阻率资料
- 三年级心理健康教学计划
- 农村饮水工程初步设计报告
- 低共熔溶剂及其应用研究进展
- 心理幸福感量表PWBS
- 南京信息工程大学C语言试题库
- GB/T 40692-2021政务信息系统定义和范围
- GB/T 19022-2003测量管理体系测量过程和测量设备的要求
评论
0/150
提交评论