一、特殊的字符串函数
1.strstr()函数
char * strstr ( const char *str1, const char * str2);
如果str2是str1的子串,则返回在str2在str1上出现的首地址,反之,则返回空指针。
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2); //断言,防止空指针的出现
const char* ch = str1;
if (*str2 == '\0')
return ch;
while (*ch)
{
const char* tmp1 = ch;
const char* tmp2 = str2;
while (*tmp1 == *tmp2 && *tmp1) //循环继续的条件是,*tmp1 == *tmp2,且*tmp1不为空
{
tmp1++;
tmp2++;
}
if (*tmp2 == '\0')
return ch;//如果执行到这一步,说明前面的循环使得str2的字符全部遍历完毕,也就是str2是str1的子串,返回ch就可以了
ch++;
}
return NULL;
}
2.strtok()函数
char * strtok ( char * str, const char * sep );
字符串切割函数,类似于split()函数。
·sep参数是一个字符串,定义了用作分隔符的字符集合。
·第一个参数指定一个字符串,它包含了0个或多个由sep字符串中一个或者多个分隔符分割的标记。
·strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。
·strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
·strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
·如果字符串中不存在更多的标记,则返回 NULL 指针。
int main()
{
char str1[] = "zsfjasfj@147.234.com";
char* p = "@.";
char* ch = NULL;
for (ch = strtok(str1, p); ch != NULL; ch = strtok(NULL, p))
{
printf("%s\n", ch);
}
return 0;
}
3.strerror()函数
char * strerror ( int errnum );
返回错误码,所对应的错误信息。
int main()
{
printf("%s\n", strerror(0));
printf("%s\n", strerror(1));
printf("%s\n", strerror(2));
printf("%s\n", strerror(3));
printf("%s\n", strerror(4));
return 0;
}
int main()
{
FILE* pFile;
pFile = fopen("unexist.ent", "r");
if (pFile == NULL)
printf("Error opening file unexist.ent: %s\n", strerror(errno));
return 0;
}
总结
使用strtok()函数时,是会改变源字符串的,所以我们在使用的使用,尽量拷贝一份临时的字符串,对该字符串进行操作。
在使用strerror()函数的使用,通常要引errno.h头文件,这个头文件里包含了一个全局变量errno,他记录的是最后一个错误码。