当前位置:网站首页>C语言之字符串函数二
C语言之字符串函数二
2022-08-01 20:51:00 【从未止步..】
strstr:查找字符串
strstr(p1(字符串),p2),在p1中寻找p2(子串)
举例:
#include<stdio.h>
#include<string.h>
int main()
{
const char* p1 = "abcdef";
const char* p2 = "def";
const char*ret=strstr(p1, p2);//在p1中寻找p2
//NUll/NUL(空指针---‘\0’)
if (ret == NULL)//如果p1中不包含p2,则ret指向的为空指针
{
printf("子串不存在");
}
else//如果p1中包含p2,则我们直接返回指针的值
{
printf("%s\n", ret);
}
return 0;
}
输出结果:
def
如果将p2修改为如下所示:
const char* p2 = "defhi";
输出结果为:
子串不存在
那么strstr到底返回的是包含子串的字符串还是子串呢?
现在我们将p1修改为如下所示:
const char* p1 = "abdefcdefbsdicwid";
defcdefbsdicwid
通过输出结果,我们不难发现strstr返回的值并不是子串,而是在字符串中第一次出现子串后的所有内容。
模拟实现strstr的原理:
#include<stdio.h>
#include<string.h>
#include<assert.h>
char*my_strstr(const char *p1, const char*p2)
{
assert(p1 != NULL);
assert(p2 != NULL);
char* s1 = NULL;
char* s2 = NULL;
char* start = (char*)p1;//p1是const类型,受保护的指针,需要进行类型转换
if (*p2 == '\0')
{
return (char*)p1;//注意强制类型转换
}
while (*start)
{
s1 = start;//start的作用相当于使s1的每个字符和s2进行比较
//例如:s1=abbbcdef s2=bbc,这种情况下,strat使s1每次移动一个字符
//使用的范围更广,而不是只适用于在两个字符串相同位置字符串相等的情况
s2 = (char*)p2;//同理上面的p1
while ((*s1 != '\0')&&(*s2 != '\0') && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return start;//找到子串
}
if(*s1=='\0)//p1的长度小于p2,提前终止
{
return NULL;
}
start++;
}
return NULL;//找不到子串
}
int main()
{
const char* p1 = "abbbcdef";
const char* p2 = "bbc";
char*ret=my_strstr(p1, p2);
if (ret == NULL)
{
printf("字符串不存在");
}
else
{
printf("%s\n", ret);
}
return 0;
}
bbcdef
strtok:charstrtok(charstr,const char*sep)
1:sep参数是个字符串,定义了用作分隔符的字符集合:
举例:char arr[] = "[email protected]";
char*p = (char*)"@.";//这里的@和点就作为分隔符的字符
2:第一个参数指定一个字符串,它包含0个或多个由sep字符串中一个或多个分隔符分割的标记
举例:char arr[] = "[email protected]";//arr为我们指定的字符串
3:strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
举例:char arr[] = "[email protected]";
char*p = (char*)"@.";//这里的@和点就作为分隔符的字符
//找到第一个分隔符@,用\0结尾,继续寻找第二个分隔符.再用\0结尾
4:strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
举例:char arr[] = "[email protected]";
char*p = (char*)"@.";//当找到第一个分隔符@之后,strtok函数会记住该位置
//下次寻找的时候就是从@后面的位置开始
5:strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
6:如果字符串中不存在更多的标记,则返回NULL指针。
那么它是如何使用的呢?
举例:
#include<stdio.h>
int main()
{
char arr[] = "[email protected]";
char *p = (char*)"@.";
char* ret = NULL;
char* ptr = NULL;
for (ret= strtok_s(arr, p,&ptr); ret != NULL;ret=strtok_s(NULL,p,&ptr))
//第一次找到分隔符zpw之后,strtok_s函数会记住这个位置,下次直接从它后面的这个字符开始查找
{
printf("%s\n", ret);
}
return 0;
}
zpw
bitedu
tech
strerror:char*strerror(int errnum)
该函数的作用即为返回错误码,所对应的错误信息。
举例:
传递0:
#include<stdio.h>
#include<errno.h>//该函数所必须包含的头文件
int main()
{
char* str = strerror(errno);//errno是一个全局的错误码的变量,当C语言的库函数在执行过程中,发生了错误,就会把对应的错误码,赋值到errno中
printf("%s\n", str);
return 0;
}
传递0:
char* str = strerror(0);
No error
传递1:
char* str = strerror(1);
operation not permitted
传递2:
char* str = strerror(2);
No such file or directory
传递3:
char* str = strerror(3);
No such process
不同的错误码对应的错误信息不同。
那么它的作用如何体现呢?
举例:
#include<stdio.h>
#include<errno.h>
int main()
{
FILE*pf=fopen("test.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
}
else
{
printf("open file success\n");
}
}
如果该路径下,不包含该名为test的文件,输出结果为:
No such file or directory
成功创建后,输出结果为:
open file success
字符分类函数:
函数--------------如果它的参数符合下列条件就返回真
举例:
#include<stdio.h>
#include<ctype.h>//islower函数包含的头文件
int main()
{
char ch = 'w';
int ret=islower(ch);//判断ch是否为小写字母
printf("%d\n", ret);
}
输出结果为一个非零的数字:
2
将ch改为大写字母:
char ch = 'W';
输出结果为:
0
字符转换函数:
比较常见的两个就是:
tolower(将字符转换为小写字母)/toupper(将字符转换为大写字母)
举例:
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = tolower('Q');
putchar(ch);
}
输出结果为:
w
#include<stdio.h>
#include<ctype.h>
int main()
{
char ch = toupper('s');
putchar(ch);
}
S
对字符串中的某些字符进行转换:
举例:
#include<stdio.h>
#include<ctype.h>
int main()
{
char arr[] = "I love china";
int i = 0;
while (arr[i])
{
if (isupper(arr[i]))//如果字符串中的字符为大写字母,则进入转换
{
arr[i] = tolower(arr[i]);
}
i++;
}
printf("%s\n", arr);
return 0;
}
i love china
边栏推荐
- 线程池处理异常的方法
- 织梦发布文章提示body has not allow words错误
- OSG Notes: Set DO_NOT_COMPUTE_NEAR_FAR to manually calculate far and near planes
- 任务调度线程池-应用定时任务
- Determine a binary tree given inorder traversal and another traversal method
- Buttons with good user experience should not have hover state on mobile phones
- StringTable详解 串池 性能调优 字符串拼接
- 扣减库存方案
- tiup mirror merge
- Godaddy domain name resolution is slow and how to use DNSPod resolution to solve it
猜你喜欢
扣减库存方案
[Personal Work] Remember - Serial Logging Tool
用户身份标识与账号体系实践
【多任务优化】DWA、DTP、Gradnorm(CVPR 2019、ECCV 2018、 ICML 2018)
Fork/Join线程池
Interview Blitz 70: What are sticky packs and half packs?How to deal with it?
98.嵌入式控制器EC实战 EC开发板开发完成
Acrel-5010重点用能单位能耗在线监测系统在湖南三立集团的应用
[Multi-task model] Progressive Layered Extraction: A Novel Multi-Task Learning Model for Personalized (RecSys'20)
[Energy Conservation Institute] Comparative analysis of smart small busbar and column head cabinet solutions in data room
随机推荐
Godaddy domain name resolution is slow and how to use DNSPod resolution to solve it
tiup mirror
Multithreaded producers and consumers
Zheng Xiangling, Chairman of Tide Pharmaceuticals, won the "2022 Outstanding Influential Entrepreneur Award" Tide Pharmaceuticals won the "Corporate Social Responsibility Model Award"
Based on FPGA in any number of bytes (single-byte or multibyte) serial port (UART) to send (including source engineering)
Redis does web page UV statistics
LinkedList source code sharing
泰德制药董事长郑翔玲荣膺“2022卓越影响力企业家奖” 泰德制药荣获“企业社会责任典范奖”
The Internet giant development process
useful website
LinkedList源码分享
Telnet弱口令渗透测试
【微信小程序】【AR】threejs-miniprogram 安装(76/100)
【多任务模型】Progressive Layered Extraction: A Novel Multi-Task Learning Model for Personalized(RecSys‘20)
STAHL触摸屏维修一体机显示屏ET-316-TX-TFT常见故障
扣减库存方案
latex paper artifact -- server deployment overleaf
Common pits in the Go language
Nacos 配置中心
tiup mirror merge