C语言-->(十三)字符串
知识点:
1.字符和字符处理函数
2.字符串的本质和字符串输入输出函数
3.字符串转换函数
4.常用字符串处理函数
5.字符串查找函数
6.字符串分割函数
7.字符串替换
8.常用字符串处理函数实现
9.sscanf sprintf函数
================================
C中必须先定义类型后使用,没有字符串类型,字符串用一串字符,基本元素是字符
“xiaoqiang\0”
字符和字符处理
1常用字符
数字字符: ‘0’ ‘1’ — ‘9’
字母字符:’M’ ‘F’ ‘a’ — ‘z’ ‘A’—-‘Z’
其它字符: ‘+’ ‘- ’ ‘*’ ‘/‘ ‘!’
2常用字符对应的ascii码
数字字符: 0 ‘0’=48 — ‘9’ =48 + 9
字母字符: ‘a’= 97 —— ‘z’ = 97 + 25 ‘A’= 65 ’’Z’ = 65 + 25 = 90
常用字符: ‘ ‘ = 32 ‘\n’ ‘\0’
3.复习ascii码
4.字符的本质
计算机是以二进制存储数据,字符是怎么存储的呢?
思考:sizeof(char)和 sizeof(‘a‘) = sizeof(97) = 4
1)字符的本质为一个int类型的ascii码
sizeof(‘a’) sizeof(“a“)
2)字符变量保存的是ascii码,但是ascii码只需要一个字节即可保存
在所有的编译系统中都规定以一个字节来存放一个字符,字符数据都是以ASCII码存储
3.使用字符判断函数
isdigit 数字字符
isalpha 字母(大小写)
isalnum 数字字符和字母
islower 小写字母
isupper 大写字母
isspace 空格字符
0 --表示测试不成立
1 --表示测试成立
练习:
1.随机输入一字符串,包含大小写字母、数字字符、空格,统计其中数字字母,大写字母,小写字母,及空格的个数
4.使用字符转换函数 //验证码
toupper 小写转换为大写
tolower 大写转换为小写
练习:
1.随机输入一字符串,包含大小写字母和空格,将原来的大写字母转换为小写字母,小写字母转换为大写。
=================================
字符串
"hello"
用“”的一串字符 ,以‘\0‘
两种表示方式
//栈
a,将一个或多个字符用“”串在一起,以字符数组存储,系统默认加‘\0‘。
//只读数据段
b,不以字符数组引用时为一个常量
1.字符串的本质
1)字符串本质为字符串常量
"hello world" "Hello world"
2.思考:sizeof(‘A‘)和sizeof(“A”)
字符常量按照4个字节处理
字符串常量为了节省内存空间,字符串中的所有字符均以char类型处理
3.char *str表示字符串和char str[]表示字符串的区别
=================================
字符串的输入输出
1.字符串的输入和输出
0)字符串输入输出函数
1>回忆scanf获取字符串
%c scanf(“%s”); string
%s printf("%s",addr)
2>如何获取带空格的字符串
%[^ \n] 正则表达式
3> puts string
4>字符串输出
puts函数会在字符串输出后添加换行符号
puts(str) = printf("%s\n",str);
1)字符串的输入与溢出问题 数组越界
思考:字符数组在输入时候的长度问题
2)解决方法
fgets
用法:fgets(buf, len, stdin); // stdin stdout stderr 两种 1接受回车 2接受\0
从标准输入获取指定长度的字符串,包含字符串结束符
(1)定义长度为10的数组,输入一串字符,包含空格回车,并输出
=================================
字符串转换函数 "100" + "200" === 100 + 200 = 300
需求:现在用户输入一个算术表达式,要求得到对应的结果
思考:如何将字符串中的字符数字转换为真实的数字
1.字符串转换函数 %d %f %o %#x %#o
1)atoi
//atoi函数的工作原理
从第一个非空格的数字符开始转换,直到遇到第一个非数字字符结束
atol
atof atof返回double
2)实现atoi函数(支持正负数)
示例:实现个位数的负数转换
练习: char *str1 = "98765"
char *str2 = "54321"
ret = 98765+ 54321
"101 0110" 十进制 10 10110
二进制 86
八进制 8^6 + 8^4 + 8^2 + 8
3)strtol函数 1010 0x123456
1>atoi的增强版 1010a1001
long strtol(char *str,char **p, int base);
字符串中不能出现和当前进制相悖的数据
1>atoi的增强版 2, 8, 10, 16
2>函数说明:将指定字符串按照base的进制方式转换为10进制
base范围为2~36
练习:输入一个字符串,再输入一个整形数,将字符串按整形数进制转换成整数
====================================
字符串常用函数
1.字符串长度计算函数 "hello"
需求:用户需要知道输入的字符数的长度
1)strlen函数使用 == string length
2)思考:strlen和sizeof的区别
(a)strlen是字符串函数,只能测试字符串,sizeof是运算符,可以计算任何类型的数据
(b)strlen 所见即所得,字符串的实际长度 ,sizeof 计算实际所占内存的长度
3)思考:strlen长度的大小‘\0‘
char arr[10] = “abc”
2.字符串拷贝函数 strcpy == string copy
记事本command + c 和comand + v
相关说明:使用注意
strncpy(dst,src,n) 将src中得前n字符copy到src
思考:strncpy拷贝后是否会包含结束符
练习:实现一个字符串拷贝模块
3.单个字符的查找
记事本中查找一个字符为例子
<a>str ch r 字符查找函数
strchr 查找字符第一次出现的地址,根据地址可以计算数组的下标,或者从指定字符输出。
<b>strrchr 查找字符最后一次出现的地址
char *p1 = strrchr(a,c);
printf("%s",p1);
练习:
输入一个字符串,再输入一个字符,查找并打印第一次出现和最后一次出现的字符并输出该字符的地址
char CHAR
4.strstr 字符串查找到 [在记事本中查找一个单词]
(a) strstr字符串查找函数
(b) str case str 字符串查找函数,不区分大小写
5.strcmp字符串比较函数
手机通信录联系人的排序 和 查找联系人
str cmp 字符串比较函数
int strcmp(const char *s1,const char *s2)
string compare 其作用是比较字符串s1,s2
从左到右逐个字符进行比较返回值不相同的那个字符ascii码差值
功能相似函数:
strcmp,
strcasecmp
strncmp,
strncasecmp
int strncmp(const char *s1, const char *s2, int n);
1)比较顺序:s1是否和s2相同
2)比较结果:0为相同,非0为不同,并且返回对应的差值
思考:非0的结果表示什么
3)思考:当s1比s2长度长的话会如何
返回s1最后一个字符和s2结束符的差
练习:
1.编写一个模拟登陆程序,输入用户名和密码,判断用户名和密码
是否和所设定的一致
2.编写一个验证程序,判断用户输入的字符串是否以qianfeng开头
6.strcat字符串连接
将一个文本copy到另一个文本的后面。
strcat 字符串连接函数 其做用是连接两个字符串
char * strcat(char *str1,char *str2)
【相关说明】:连接原理
char a[30] = "qianfeng"
char b[ ] ="hulian"
strcat(a,b);
puts(a);
char * strcat(char *str1,char *str2, n ); //将str2 中前N个字符连接到str1后面
strcat,strncat
练习:先输入自己的姓,再输入名字,最后将连接好的名字输出
需求:用户现在需要按照一定的格式分割一个字符串
7.字符串分割函数
1)strtok使用
char * strtok(char *str,const char *delim);
//分解一组字符串,str是要分解的字符串,delim为分个字符串 ,首次调用时,str要指向要分割的字符串,之后再次调用时要把str设为NULL ,strtok在str中查找到delim字符并用‘\0‘
来替换,直到找遍整个字符串。
1>要分割的内容
2>分割符,分割标记
2)如何获取下一个字符串
3)注意
0>不能截取字符串常量
1>截取后的长度
2>如果在下一次截取前截取另外一个字符串会如何
练习:
1.192.168.88.8
2.查找字符串中的最长单词,并且输出该单词
=====================================
常用字符串处理函数的实现
1.字符处理函数的实现
2.字符串处理函数的实现
strlen
int mystrlen(const char *str);
char* mystrcpy(char *dst, const char *src)
char *mystrchr(char *str, int c);
char *mystrrchr(char *str, int c);
====================================
sprintf和sscanf
需求:用户需要将每个用户的信息按照以下格式输出
1.字符串格式化函数
1)sprintf使用
2)printf和sprintf对比
int sprintf(const char *s, const char *fmt, …)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。