目录
1. strstr
该函数是用来查找str1字符串中是否含有str2字符串
存在:返回str2字符串所在的起始地址
不存在:返回NULL
int main()
{
char str1[] = "abcdefabc";
char str2[] = "fab";
char* p = strstr(str1, str2); //strstr函数的返回值为char*类型,所以创建一个char*类型的p来
//接收地址
printf("%s\n", p);
return 0;
}
如果str1字符串中含有多个str2字符串,那么返回第一次找到的str2的地址
int main()
{
char str1[] = "cdefabcfabfabdef";//含有多个"fab"字符串
char str2[] = "fab";
char* p = strstr(str1, str2);
printf("%s\n", p);
return 0;
}
找不到就是不存在,返回NULL
int main()
{
char str1[] = "cdefadbc";
char str2[] = "fab";
char* p = strstr(str1, str2);
if (p == NULL)
printf("不存在\n");
else
printf("%s\n", p);
return 0;
}
模拟实现:
创建一个my_strstr函数,模拟实现strstr函数的功能:
char* my_strstr(const char* str1, const char* str2)
{ //通过4指针法实现
assert(str1 && str2);
char* s1 = str1;
char* s2 = str2;
while (*s1++ != '\0')
{
while (*s1 != *s2 && *s1 != '\0')
s1++;
str1 = s1;
while (*s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return str1;
s1 = str1;
s2 = str2;
}
return NULL;
}
int main()
{
char arr1[] = "abcdefabcab";
char arr2[] = "fabc";
char* p = my_strstr(arr1, arr2);
if (p == NULL)
printf("不存在\n");
else
printf("%s\n", p);
return 0;
}
2. strtok
该函数的返回类型为char*类型,
delimiters参数是个字符串,定义了用作分隔符的字符集合,
第一个参数指定一个字符串,它包含了0个或者多个由delimiters字符串中一个或者多个分隔符分割的标记。
该函数的作用是:将str所指向的字符串按分隔符分割成若干段字符串。
重点:
1. strtok函数找到str中的下一个标记,并将其用 '\0' 结尾,返回一个指向这个标记起始位置的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
2. strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
3. strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
4. 如果字符串中不存在更多的标记,则返回 NULL 指针。
int main()
{
char* p = "shandongkejidaxue@985.com";
const char* del = ".@";
char arr[30];
strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
char* str = strtok(arr, del);
printf("%s\n", str);
}
以上面这段代码为例:
将p所指向的字符串拷贝到arr中,将arr传给strtok函数,再传分隔符的字符串del,这样函数就会找arr字符串中有没有del中的字符,将找到的第一个标记改为'\0',这里找到的第一个标记就是'@',并返回指向这个标记起始位置的指针,这里我们用str接收,然后以str为指针打印字符串,就得到了"shandongkejidaxue"。
此时,我们要是想继续打印接下来分割的字符串,还需要再用一次strtok函数,不过这次我们第一个参数就直接给NULL就行,因为当strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置,我们上一次用strtok函数时,他已经保存了第一个标记的位置,所以我们第二次使用strtok函数时第一个参数传NULL,这时strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记,这样一来,就可以继续分割后面的字符串了。以此类推,第三次、第四次均是如此~
int main()
{
char* p = "shandongkejidaxue@985.com";
const char* del = ".@";
char arr[30];
strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
char* str = strtok(arr, del);
printf("%s\n", str);
str = strtok(NULL, del);
printf("%s\n", str);
str = strtok(NULL, del);
printf("%s\n", str);
}
当我们不知道所要分割的字符串中含有多少个分隔符时,我们可以用循环来实现
#include <stdio.h>
int main()
{
char* p = "shandongkejidaxue@985.com";
const char* del = ".@";
char arr[30];
char* str = NULL;
strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
for (str = strtok(arr, del); str != NULL; str = strtok(NULL, del))
{//如果字符串中不存在更多的标记,则返回 NULL 指针,所以当str为NULL时就说明字符串已经分割完
//成了。
printf("%s\n", str);
}
}
3. strerror
参数为错误码
返回值为错误码所对应的错误信息
这里的0、1、2、3、4均为错误码,一个错误码对应一个错误信息。
那么怎么用这个函数呢?
这里举一个例子:
//errno 为C语言提供的全局的错误码变量,将错误码记录到该变量中
//头文件为 <errno.h>
#include <errno.h>
int main()
{
//打开一个文件并读取
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)//若为NULL表示打开失败
{
printf("%s\n", strerror(errno));
}
else
{
//读文件
//关闭文件
fclose(pf);
pf = NULL;
}
return 0;
}
表示没有找到该文件,即该文件不存在。
perror:
这里还有一个函数与strerror函数相似:
perror (头文件为 <stdio.h>)
int main()
{
//打开一个文件并读取
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)//若为NULL表示打开失败
{
perror("fopen");//内容可以根据需要随意更改~
}
else
{
//读文件
//关闭文件
fclose(pf);
pf = NULL;
}
return 0;
}