主要介绍字符串相关函数中的
strstr()
函数、strtok()
函数、strerror()
函数。
点击转到cpluscplus.com官网 - strstr
所需头文件为<string.h>
功能:在前一个字符串
str1
中找后一个字符串是否出现在前一个字符串中。就是查找子字符串。 返回值:返回str1
中第一个出现的str2
的指针,如果str2
不是str1
的一部分就返回空指针。
例子:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "123456789@qq.com";
char str2[] = "12345";
char* p = strstr(str1, str2);
if (p) {
puts(p);
}
else {
printf("没找到\n");
}
return 0;
}
运行结果:
本质是比较字符串,在字符相同的情况下,依次比较下一对字符直到遇到
str2
中的'\0'
就说明找到了。或者遇到str1
的'\0'
说明没找到。或者下一对字符不相等,再重新开始比较:str1
在上一次跳过字符的基础上再跳过一个字符,str2
跳回起始字符。 在比较中需要记录待比较字符的位置,s1
指向str1
即主串,s2
指向str2
即子串;比较失败时s1
需要回跳到本次比较起始位置的下一个字符地址。s2
回跳到str1
起始字符地址。开始下一次比较。
//模拟实现strstr
//一般算法
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2) {
//断言
assert(str1 && str2);
//s1指向待查找的字符串str1
const char* s1 = str1;
//s2指向字符串str2
const char* s2 = str2;
//p指向字符串str1,每次s1与s2移动时保持不变,以便当前查找失败时s1能够找到下次查找的位置
const char* p = str1;
while (*p) {
//每次查找开始时,s1指向被p更新
s1 = p;
//s1与s2都没有指向字符串末尾,且二者所指向字符相等
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2) {
s1++;
s2++;
}
//是否到达str2字符串的末尾,若到达就返回本次查找的起始地址
if (*s2 == '\0') {
return (char*)p;
}
//本次查找未找到
p++;
}
return NULL;
}
int main() {
char str1[] = "aasfb";
char str2[] = "b";
char* p = my_strstr(str1, str2);
if (p) {
printf("找到了: %s", p);
}
else {
printf("%s不存在\n", str2);
}
return 0;
}
char * strtok ( char * str, const char * delimiters );
所需头文件为<string.h>
delimiters
参数是个字符串,定义了用作分隔符的字符集合。str
指向一个字符串,它包含了0个或多个由delimiters
字符串中一个或多个分隔符分割的标记。strtok
函数找到str
中的下一个标记(子字符串),并将其用'\0'
结尾,返回一个指向这个标记的指针。strtok
函数会改变(破坏)被操作的字符串,所以使用strtok
函数切割的字符串一般是副本并且可以被修改。strtok
函数的第一个参数不是NULL
时,函数将找到传入字符串str
中的第一个标记(子字符串),strtok
函数将保存它在字符串中的位置。strtok
函数的第一个参数是NULL
时(大概率说明这不是第一次调用,否则返回空指针NULL
),函数将在同一个字符串中被保存的位置开始,查找下一个标记(子字符串)。NULL
。#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "123456789@qq.com";
char str2[20] = { 0 };
strcpy(str2, str1);
char str3[] = { "@." };
for (char* p = strtok(str2, str3); p != NULL; p = strtok(NULL, str3)) {
printf("%s\n", p);
}
return 0;
}
运行结果:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "123456789@qq.com";
char str2[20] = { 0 };
strcpy(str2, str1);
char str3[] = { "@." };
printf("%s\n", strtok(str2, str3));
printf("%s\n", strtok(NULL, str3));
strcpy(str2, str1);
printf("%s\n", strtok(str2, str3));
printf("%s\n", strtok(NULL, str3));
printf("%s\n", strtok(NULL, str3));
return 0;
}
运行结果:
char* strerror (int errnum);
点击转到cplusplus.com官网 - strerror
所需头文件为<string.h>
errnum
,返回一个字符指针,指向了包含与错误码有关的错误信息的相应的字符串。errno
记录,可以被心得错误码覆盖。调用strerror
函数时就可以传入errno
。errno
调用库函数的头文件是<errno.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main (){
FILE * pFile;
//已知记事本hello.text不存在
pFile = fopen ("hello,txt","r");
if (pFile == NULL)
printf ("Error opening file unexist.ent: %s\n",strerror(errno));
return 0;
}
运行结果:
END