C语言---10库函数
目录
一、数学函数
(一)求绝对值函数
(二)浮点数求余函数
(三)求次方函数
(四)开平方函数
二、随机数函数、时间日期函数
(一)时间日期函数
(二)随机数函数
1、rand随机数函数
2、srand随机数种子
三、字符串处理函数
(一)字符串拼接函数 strcat、strncat
1、strcat
2、strncat
3、案例:自定义my_strcat函数,不能使用strcat函数
(二)字符串拷贝函数 strcpy、strancpy
1、strcpy
2、案例:自定义实现strcpy,可以通过两个字符串的指针同步移动来实现
3、strncpy
(三)字符串比较函数 strcmp、strncmp
1、strcmp(整个字符串的比较)
2、strncmp(字符串局部比较)
(四)测字符串长度函数 strlen
1、案例:自定义一个my_strlen函数测量字符串长度(不能在函数里面使用strlen)
(五)字符串内存空间函数 sizeof
(六)实例
四、字符串变换函数
(一)字符匹配函数 strchr
(二)字符串匹配函数 strstr
(三)内存空间设置函数 memset
1、案例:屏蔽敏感词
(四)字符串转换功能 atoi/atol/atof
1、自定义函数实现atoi的功能
(五)字符串分割函数 strtok
1、将 "hehe:haha:xixi:lala"进行切割,分隔符为:
一、数学函数
#include <math.h> // 数学函数头文件
(一)求绝对值函数
void fun7(){int a = 10, b = -12;printf("%d\t%d\n", abs(a), abs(b)); // abs函数在stdlib.h头文件里面有声明不加数学函数头文件也可以使用float n = 3.14, m = -0.56;printf("%lf\t%lf\n", fabs(n), fabs(m));}
(二)浮点数求余函数
'%'整数求余运算符,没有浮点数求余运算符
void fun8(){double x = 3.4, y = 1.3;printf("%lf\n", fmod(x, y)); // 0.800000}
(三)求次方函数
pow函数返回的是double类型的值
void fun9(){printf("%lf\n",pow(2, 4)); // 求2的4次方}
(四)开平方函数
相当于数学里的根号√ ̄
void fun10(){printf("%lf\n", sqrt(16)); // 求16的开平方printf("%lf\n", sqrt(9.9)); // 求9.9的开平方// C语言中没有开次方函数,如何实现开次方?printf("%lf\n", sqrt(sqrt(16))); // 求16的开4次方}
二、随机数函数、时间日期函数
(一)时间日期函数
#include <time.h> //时间日期函数头文件
time获取当前时间函数
void fun11(){printf("%d\n",time(NULL)); // 输出:1634564680// 从1970年1月1日0时0分0秒到现在的秒数,截止到到2021年10月18日21时44分为1634564680}
(二)随机数函数
#include<stdlib.h>
1、rand随机数函数
rand函数用于随机产生一个数,完全随机还需要时刻改变随机种子
只在第一次运行时随机一次,之后产生的随机数都是一样的,这种随机称为“伪随机”
void fun12(){printf("%d\n", rand()); // 41}
2、srand随机数种子
产生随机数的参考值
可以通过srand函数改变随机种子
如果要使rand随机数函数产生完全随机的数据,就需要时刻改变随机数种子(随机数的参考值)
void fun13(){srand(time(NULL)); // 时刻改变随机种子,可以使用时间函数作为随机种子,因为时间时刻会以秒为单位变化while (1){printf("%d\n", rand()); // 38Sleep(100); // 延时0.1秒钟}}
三、字符串处理函数
#include<string.h> // 字符串处理函数头文件
(一)字符串拼接函数 strcat、strncat
将字符串str2连接到字符串str1之后 ,第一个字符串要有足够的内存能够容纳两个字符串中所有的字符
1、strcat
原型:char *strcat(char *str1, const char *str2);
功能:将str2连接到str1的末尾(str1t第一个'\0'的位置)
返回值:返回str1字符串的首地址
注意:'\0'会拷贝过去
char src1[]="world";
char src2[]="wor\0ld";
char dst[128]="hello";strcat(dst,src1);
strcat(dst,src2);printf("%s\n",dst); // "helloworld"
printf("%s\n",dst); // "hellowor"
2、strncat
原型:char *strcat(char *str1, const char *str2, int num);
功能:将str2前num个字母连接到str1后面
返回值:返回str1字符串的首地址
注意:'\0'会拷贝过去
char src[]="world";
char dst[128]="hello";
strncat(dst,src,2);printf("%s\n",dst); // "hellowo"
3、案例:自定义my_strcat函数,不能使用strcat函数
(二)字符串拷贝函数 strcpy、strancpy
- 不能直接把字符串常量和字符数组内容赋值给另一个字符数组,需要借助函数来进行
1、strcpy
原型:char *strcpy(char *dest, const char *src);
功能:将字符串src复制到字符串dest中,以'\0'作为结束
返回值:返回dest字符串的首地址
注意:遇到'\0'会结束,只是'\0'也会拷贝过去
将字符串拷贝到一个空的空间
char src1[]="hello string";
char src2[]="hello\0string"; // 字符串中有'\0'
char dst[128]=""; // 保证dst足够大strcpy(dst,src1);
strcpy(dst,src2);printf("dst=%s\n",dst); // "hello string"
printf("dst=%s\n",dst); // "hello"
- 将字符串拷贝到一个有内容的空间中 ,直接覆盖原来的内容
char str1[10] = "123456", str2[10] = "abc";
puts(str1);
printf("%s", str1);
strcpy(str1, str2); // 将字符串str2复制到字符串str1中,以'\0'作为结束
for (int i = 0; i < 10; i++)
{putchar(str1[i]); // abc(\0)456
}
putchar('\n');
for (int i = 0; i < 10; i++)
{putchar(str2[i]); // abc\0
}
2、案例:自定义实现strcpy,可以通过两个字符串的指针同步移动来实现
char *my_strcpy(char *dst,const char *src)
{
#if 0do{*dst = *src;dst++;src++;}while(*src != '\0');*dst='\0';
#endifwhile(*dst++ = *src++);
}void test02()
{char src[]="hello\0string";char dst[128]="";my_strcpy(dst,src);printf("dst=%s\n",dst);//"hello"
}
3、strncpy
原型:char *strncpy(char *dest, const char *src, int num);
功能:把src所指向的字符串的前num个字符复制到dest所指向的空间中
返回值:返回dest字符串的首地址
注意:'\0'不拷贝
char src1[]="hello string";
char src2[]="hello"; // 字符串中有'\0'
char dst[128]=""; // 保证dst足够大strncpy(dst,src1,3);
strncpy(dst,src2,30);printf("dst=%s\n",dst); // "hel"
printf("dst=%s\n",dst); // "hello"
(三)字符串比较函数 strcmp、strncmp
1、strcmp(整个字符串的比较)
原型:int strcmp(const char *str1, const char *str2);
功能:比较str1和str2的大小,对两个字符串从左到右逐个字符相比ASCII码值,直到出现不同字符或者\0为止,也就是比较不同的第一个字符
返回值:相等返回0,str1 > str2返回 > 0,str1 < str2返回 < 0
char s1[]="hehe haha";
char s2[]="hehe xixi"; // s1<s2if(strcmp(s1,s2) > 0 )
{printf("s1 > s2\n");
}
else if(strcmp(s1,s2) < 0 )
{printf("s1 < s2\n");
}
else if(strcmp(s1,s2) == 0)
{printf("s1 == s2\n");
}
2、strncmp(字符串局部比较)
原型:int strcmp(const char *str1, const char *str2, int num);
功能:比较str1和str2的前num个字符串的大小
返回值:相等返回0,str1 > str2返回 > 0,str1 < str2返回 < 0
char s1[]="hehe haha";
char s2[]="hehe xixi"; // 比较前四个字母的大小,s1==s2if(strncmp(s1,s2,4) > 0 )
{printf("s1 > s2\n");
}
else if(strncmp(s1,s2,4) < 0 )
{printf("s1 < s2\n");
}
else if(strncmp(s1,s2,4) == 0)
{printf("s1 == s2\n");
}
(四)测字符串长度函数 strlen
原型:int strlen(const char *str);
功能:计算字符串长度,不含'\0'
形参:存放字符串内存空间的首地址。形参str用const修饰表示指向的空间中数据只读不可修改
char buf1[128]="hehehe";
char buf2[]="hehehe";
char buf3[]="hehe\0he";// \123 代表一个字符 \hhh 八进制转义h: 0~7
// \\表示'\'
char buf4[]="hehe\123\\he";// \x2f表示一个字符 \xdd 十六进制转义 d:0~9 a~f
char buf5[]="hehe\x2fhe";printf("%d\n",sizeof(buf1)); // 128
printf("%d\n",strlen(buf1)); // 6printf("%d\n",sizeof(buf2)); // 7
printf("%d\n",strlen(buf2)); // 6printf("%d\n",sizeof(buf3)); // 8
printf("%d\n",strlen(buf3)); // 4printf("%d\n",sizeof(buf4)); // 9
printf("%d\n",strlen(buf4)); // 8
printf("%s\n",buf4);printf("%d\n",sizeof(buf5)); // 8
printf("%d\n",strlen(buf5)); // 7char buf6[]="\0hehe\0hehe";
printf("%d\n",strlen(buf6)); // 0,这里不是说真的没有内容,需要一字节一字节的看
1、案例:自定义一个my_strlen函数测量字符串长度(不能在函数里面使用strlen)
(五)字符串内存空间函数 sizeof
字符串的内存大小(字节数),会将'\0'计算在内
(六)实例
#include<stdio.h>#include<string.h>// 有三个国家,按要求找出按字母顺序排在前面的国家void test(char str[][30], int n){int i;char string[30];strcpy(string, str[0]);for (i = 0; i < n; i++){if (strcmp(str[i], string) < 0)strcpy(string, str[i]);}printf("%s", string);}int main(){int i;char country_name[3][30] = { "GERMANY","FRANCH","CHINA"};test(country_name, 3);return 0;}
四、字符串变换函数
(一)字符匹配函数 strchr
原型:char *strchr(const char *str1, char ch);
功能:在字符串str1中查找字母ch出现的位置
返回值:字符串中ch第一次出现的位置(地址),如果找不到返回NULL
找到ch(自定义输入)在字符串当中的位置
char str[10] = "123abc!@#",ch;
printf("字符数组的首地址为:%p\n", str); // 判断ch的位置对不对
ch = getchar();
printf("字符%c在字符串中的位置为:%p\n", ch, strchr(str, ch));
// strchr求字符串中字符第一次出现的位置,如果找到则返回字符所在的位置,没找到则返回null
putchar(*strchr(str, ch));
找到第一个'o'在字符串phone.com中的位置,并将其替换成'#',得到ph#ne.com
char str[]="phone.com";
char *ret = NULL;ret = strchr(str,'o');
if(ret != NULL)
{*ret = '#';
}
printf("str=%s\n",str); // "1000ph#ne.com";
进一步优化, 通过while循环,将字符串中的所有'o'都替换成'#',全部找到后strchr返回NULL,循环结束
char str[]="phone.com";
char *ret = NULL;while((ret = strchr(str,'o')) && (*ret = '#') );printf("str=%s\n",str); // "ph#ne.c#m";
(二)字符串匹配函数 strstr
原型:char *strstr(const char *str1, const char *str2);
功能:在字符串str1中查找字符串str2出现的位置
返回值:字符串中str2第一次出现的位置(地址),如果找不到返回NULL
// 求字符串"abcabcbc"中子串"bc"所在的位置(地址),如果没有找到则返回null
void fun6(){char str[10] = "abcabcbc";puts(strstr(str, "bc")); // 以%s格式输出从bc开始的字符串 printf("%p\n%p\n",str,strstr(str,"bc"));//子串"bc"所在的位置(地址)putchar('\n');for (char * strtemp = strstr(str, "bc");strtemp < strstr(str, "bc") + strlen("bc");strtemp++){putchar(*strtemp);}putchar('\n');}
(三)内存空间设置函数 memset
原型:void *menset(void *str, char c, int n);
功能:将str所指向的内存区前n个全部用c填满。常用于清除指定空间,比如数组或动态开辟的空间
返回值:返回str的地址
1、案例:屏蔽敏感词
第一次查找sex,ret指向sex.777.sex.com首地址,将该空间的前三个用#填满;继续找sex,ret指向sex.com首地址,将sex改为###
char s1[]="www.sex.777.sex.com";
char s2[]="sex";
char *ret = NULL;while(1)
{ret = strstr(s1,s2);if(ret == NULL){break;}memset(ret,'#', 3); printf("%s\n",s1); // "www.###.777.###.com"
(四)字符串转换功能 atoi/atol/atof
原型
int atoi(const char *str);
long atol(const char *str);
double atof(const char *str);
功能:将str所指向的数字字符串转化为int\long\double型数字
头文件:#include<stdlib.h>
printf("%d\n",atoi("123"));
printf("%ld\n",atol("12345"));
printf("%f\n",atof("12.3"));// 结果:123 12345 12.300000
1、自定义函数实现atoi的功能
(*buf++)‐'0'得到ASCII差值
int my_atoi(char *buf) // 传进来数字字符串,返回整型数值
{// buf="1234"int sum = 0;while(*buf != '\0' && (*buf>='0' && *buf<='9')) // 限定只传数字{sum = sum*10+(*buf++)‐'0'; // (*buf++)‐'0'得到ASCII差值}return sum;
}void test02()
{char buf[128]="";printf("请输入字符串:");scanf("%s",buf);printf("%d\n",my_atoi(buf));return;
}
(五)字符串分割函数 strtok
原型:char *strtok(char *str, const char *delim)
功能:将字符串切割成一个个片段
形参:str指向欲分割对象,delim则为分割字符串中所包含的所有字符
返回值:切割成功则返回切割到字符串片段的首元素地址,失败则返回NULL
注意
strtok不能切割字符串常量
当函数在参数s的字符串中发现参数delim中所包含的分割字符时,将该字符改为'\0'字符,当连续出现多个时只替换第一个为'\0'
第一次切割: str必须指向要切割的字符串首元素地址,delim指向要切割的符号
第2~n次切割:str必须指向NULL(从上一次切割位置继续进行切割),delim指向要切割的符号
1、将 "hehe:haha:xixi:lala"进行切割,分隔符为:
如果切割完成会产生 "hehe" "haha" "xixi" "lala" "heihie" "henhen"
一般选择 char *arr[] 指针数组来存放上面独立的字符串的首元素地址
char buf[]="hehehe:haha:xixi:lala:heihei:henhen";
char *arr[32]={NULL};
// 优化:char *arr[32]={buf,NULL};
int i=0;// 第1次切割
arr[i] = strtok(buf, ":");// 第2~n切割
while(arr[i] != NULL) // 保证上一次切割正常才有进行下一次切割的必要
{i++;arr[i] = strtok(NULL,":");
}// 优化切割
// while(arr[i++] = strtok(arr[i],":")); // arr[i]是剪切后字符的首地址// 遍历切割的内容
i=0;
while(arr[i] != NULL)
{printf("%s\n",arr[i]);i++;
}
C语言---10库函数相关推荐
- C语言写文件到txt里有屯字,C语言10 文件.ppt
第十章 文件 C文件概述 文件类型指针 文件的打开与关闭 文件的读写 文件的定位 出错的检测 赂恰滔氢戳骏市蔫盒少郴害篆汤看拴掳驮泅戈呕压琐憨波褪队敛紫爸戏仅C语言10 文件C语言10 文件 10.1 ...
- c语言库函数说明,C语言常用库函数说明
C语言常用库函数说明 序号 库类别 头文件 详细说明 1 错误处理 errno.h 2 字符处理 ctype.h 3 地区化 local.h 4 数学函数 math.h 5 信号处理 signal.h ...
- C语言strcpy库函数的讲解
C语言strcpy库函数的讲解 附1:MSDN关于strcpy库函数的简介 思路: 1.从上面的MSDN关于strcpy库函数的简介中,我们可以知道,传进函数的第一个参数是目标数组,也就是用来接收被拷 ...
- C语言的库函数、自定义函数、嵌套函数,以及递归函数
函数是C语言和C++很重要的部分,从它们本身有的系统的库函数,到我们自定义类型的函数.我们需要了解进一步地了解它们,掌握它们,使用它们. 目录 库函数 常见的库函数 自定义函数 1.自定义取最大值得函 ...
- C语言字符串库函数 #include <string.h>
c语言字符串库函数#include<string.h> 在头文件<string.h>中定义了两组字符串函数.第一组函数的名字以str开头:第二组函数的名字以mem开头.只有函数 ...
- 【C语言】库函数的使用与模拟实现(strlen、strcpy、strcmp....
经历了C语言基础篇的学习,让我们来简单了解几个C语言的库函数! 目录 1.strlen 2.strcpy 3.strcmp 4.strcat 5.strstr 6.strtok 7.字符分类函数 8. ...
- 在汇编程序中调用C语言的库函数,h转inc
在汇编语言中如果能够调用C语言的库函数,有时会很方便 先给个示例程序: .386 .model flat,stdcall option casemap:none ;Include定义 include ...
- 清华大学c语言指针ppt,清华大学出版社-C语言10指针.ppt
清华大学出版社-C语言10指针 void print(char *name[ ],int n) {int i: for(i=0:i<n:i++) printf(″%s\n″,name[i]): ...
- C语言字符串库函数api
C语言字符串库函数api 快速的上手api是一种能力 strnset函数有错误 典型的状态函数 快速的上手api是一种能力 建立正确的程序运行示意图,(内存四区及函数调用堆栈图)是根本保障!! int ...
最新文章
- Mask R-CNN用于目标检测和分割代码实现
- java单例模式的实现方法_Java中的五种单例模式实现方法
- 英语作文题目计算机,跪求一篇英语作文 题目:论计算机的优缺点
- BT觀念分享和常見問題彙整
- pwdencrypt,pwdcompare
- MySQL中的浮点数类型和定点数类型
- html安装网卡驱动,如何手动安装无线网卡驱动,网卡驱动安装教程
- git 清除 另一个git进程似乎在这个仓库中运行。。。。。
- BAT大神推荐:看懂英文文档,每天只需要10分钟做这件事……
- 计算机科学美国大学专业,美国大学Computer Science 计算机科学专业排名(转)...
- PHP并发IO编程实践
- [约瑟夫环]n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始... ...
- 学习 Java,使用哪个版本最好
- STM32F4 USB3300 fs/hs uvc实现ov2640的图像传输和静态图片
- MIT molecular Biology 笔记11 位点特异性重组 和 DNA转座
- 怎么用计算机打印出东西,怎样在电脑上打印东西_怎么用电脑打印东西
- 两部苹果手机同步照片_苹果手机误删照片怎么恢复?
- 知道Unicode表的数字,怎么用java推出相对应的日文?
- dump和coredump
- 工作笔记先-xw-server
热门文章
- 董璇高云翔今日大婚三大悬念 200万奢华婚礼现场曝光(图)
- iOS开发中WebP格式的64位支持处理
- 【小5聊】Vue开发环境配置(Windows)
- 美团149道面试题,全会拿40Koffer没问题(Java程序员学习方向)
- 测试工具网址大全(转)
- kafka eagle安装与使用
- 运放设计经验谈:运放十坑-运算放大器
- 【那些年,我们一起追的女孩】 第一章
- python股票量化交易入门到实践_量化资料学习《Python与量化投资从基础到实战》+《量化交易之路用Python做股票量化分析》+《组织与管理研究的实证方法第2版》...
- 倒霉的一天 新的开始