strstr:寻找子字符串
库函数:char* strstr(const char* str1,const char* str2),
返回值:如果存在,返回str2在str1中第一出现的位置;如果不存在,返回空指针NULL
const char* str1 = "hello world";
const char* str2 = "wor";
char* ret = strstr(str1,str2);
if (ret == NULL)
printf("子串不存在"\n);
else
printf("%s\n", ret); // world
#include <stdio.h>
#include <assert.h>
// my_strstr的实现:
char* my_strstr(const char* p1, const char* p2)
{
assert(p1 && p2);
// 记录字符位置的指针:str1、str2
char* str1 = p1;
char* str2 = p2;
// 判断p2指向的字符串是否为空
if (p2 == "")
return p1;
while (*str1 != '\0') // 直到将str1比较完
{
p1 = str1;
p2 = str2;
while ((*p1 != '\0') && (*p2 != '\0') && (*p1 == *p2))
{
p1++;
p2++;
}
if (*p2 == '\0')
return str1;
if (*p1 == '\0')
return NULL;
if (*p1 != *p2)
str1++;
}
}
int main()
{
const char* p1 = "abbbcdef";
const char* p2 = "bbc";
// my_strstr 的实现:
int ret = my_strstr(p1, p2);
if (ret == NULL)
printf("子串不存在\n");
else
printf("%s\n", ret);
return 0;
}
strtok:切割字符串
库函数:char* strtok(char* str, const char* sep)
第二个参数:sep指向的有分隔符组成的字符串;第一个参数:需要进行分隔的字符串
函数工作:在字符串中找到分隔符,并用'\0'替换它,返回指向这一段字符的指针
由于strtok函数会改变字符串本身的内容,所以一般切割的是临时拷贝的字符串
char* str = "zpw@bitdu.tech";
char* sep = "@.";
char buf[1024] = { 0 };
// 完成字符串的拷贝
strcpy(buf, str);
// 分割1
char* ret = strtok(buf, sep);
printf("%s\n, ret); // zpw
ret = strtok(NULL, sep);
printf("%s\n, ret); // bitdu
ret = strtok(NULL, sep);
printf("%s\n, ret); // tech
// 利用循环
char* ret = NULL;
for (ret = strtok(buf, sep); ret != NULL; ret=strtok(NULL,sep))
{
printf("%s\n, ret);
}
函数第一次切割字符串时,传入的第一个参数为字符串的首地址;在第二次之后,传入的第一个参数为NULL;
函数中含有静态变量,会记录上次切割的位置,从该位置向后查找切割
函数不再含有切割符,返回NULL空指针
strerror:字符串错误信息
库函数:char* strerror(int errnum),返回错误码对应的错误信息
errno:全局的错误码变量,当C语言的库函数在执行过程中发生了错误,就把对应的错误码赋值到errno变量中
字符分类函数:
字符分类函数:头文件<ctype.h>
iscntrl -- 任何控制字符; isspace -- 空白字符:空格、换页、换行、回车、制表符
isdigit -- 十进制数字0~9; isxdigit -- 十六进制数 islower -- 小写字母
isupper -- 大写字母 isalpha -- 字母 isalnum -- 字母或数字 ispunct -- 标点符号
isgraph -- 任何图形字符 isprint -- 任何可打印的
字符转换函数:
tolower :转小写,int tolower(int c)
toupper : 转大写,int toupper(int c)