- 有关字符串查找和错误信息报告
- 字符串查找(两个):
- strstr
- 1. 格式
- 2. 用法
- 2.1 简单实现查找
- 2.2 与替换的结合使用
- 3. 模拟实现
- 3.1 实现函数
- 3.2 实现函数2
- 3.3 main函数
- strtok
- 1. 格式
- 2. 使用
- 2.1 演示所写代码使用函数的流程
- 2.2 for循环实现简化版本
- 错误信息报告:strerror
- 1. 格式
- 2. 使用
- 2.1 文件 *** 作
char * strstr ( const char *str1, const char * str2);
- Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part of str1.
2.1 简单实现查找在一个字符串中另外一个字符串是否存在
存在:返回子串第一次出现的位置
不存在:返回NULL
int main()
{
char arr1[] = "abcdef";
char arr2[] = "bcd";
char* p = strstr(arr1, arr2);
if (p == NULL)
prinrf("不存在\n");
else
printf("%s\n", p);
return 0;
}
2.2 与替换的结合使用
int main ()
{
char str[] ="This is a simple string";
char * pch;
pch = strstr (str,"simple");//查找
strncpy (pch,"sample",6);//替换错误单词
puts (str);
return 0;
}
3. 模拟实现
3.1 实现函数
暴力求解
char* my_strstr(const char* str1, const char* str2)
{
const char* s1 = str1;
const char* s2 = str2;
const char* p = str1;
if(*str2==')'return
; str1while
( *)p=
{
s1 ; p=
s2 ; str2while
( *!=s1 '&&'*!= '&&'s2(*==*)s1)++s2;++
{
s1;}
s2if(
*
== ')'returns2 ( char*
) ;//找到了++;p}return
pNULL;
//找不到子串
} char*strstr
(
3.2 实现函数2KMP算法 - B站:比特大博哥(难度较大)
const char * ,const char * str1) char * = str2(
{
char *cp ) ;char *, str1*
; ifs1( !s2*
) return ((str2 char
*)); while(str1*)
= ;=cp(
{
s1 char cp*
s2 ) ;while (* str2&&
* && !s1 ( *s2 - *))s1++,s2++ ;
s1if( s2!*
) return()s2;
++;cp}return
cp(NULL
)
;}intmain(
)
3.3 main函数
char []=
{
"abcdefabcdef" arr1;char [ ]=
"cde" arr2;char * =strstr
(, p ) ;ifarr1( arr2==NULL
) prinrfp ( "不存在\n")
;elseprintf("%s\n"
,
);return0 p;}
char *strtok
(
strtok
1. 格式
char * , const char * str) ; 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。 //把arr传给str,把@.传给sep sep constchar
2. 使用
- *
=
"@." ;//为了不修改原内容 pchar[]
-
strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。
(注:strtok函数会改变被 *** 作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
=
"Jumpingtiger@007.com" arr;char[200]
= buf0};strcpy{(,)
;//拷贝一份,保证chararr[]中值不变bufconstarrchar*=
"@." ;strtok p(,)
;strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记(内部有const的记忆函数),strtok函数将保存它在字符串中的位置。 bufstrtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。 p//第二次包括第二次以后的调用strtok
- (
- NULL
,
);如果字符串中不存在更多的标记,则返回 NULL 指针。 intstrmain(
2.1 演示所写代码使用函数的流程
- )
char []=
{
"Jumpingtiger@007.com" arr;char [ 200]
= buf0}; //"Jumpingtiger@007.com" { strcpy (,)
;//拷贝一份,保证chararr[]中值不变bufconst arrchar*=
"@." ;char p * =strtok
(, str);printfbuf( p"%s\n",
);=strtok str(NULL
str , );printf( p"%s\n",
);=strtok str(NULL
str , );prinrf( p"%s\n",
);return0 str;}
int main(
)
2.2 for循环实现简化版本
char []=
{
"Jumpingtiger@007.com" arr;char [ 200]
= buf0}; //"Jumpingtiger@007.com" { strcpy (,)
;//拷贝一份,保证chararr[]中值不变bufconst arrchar*=
"@." ;char p * =NULL
;for str ( =strtok
( ,str ) ;!=bufNULL p;= str strtok (NULL str , ))printf( p"%s\n",
);return0 str;}
char *strerror
(
错误信息报告:strerror
1. 格式
int ) ; 把错误码转换成错误信息。 int errnum main(
- )
2.1 文件 *** 作返回错误码,所对应的错误信息。
* ;=fopen
{
FILE( pFile"unexist.ent"
pFile , "r");//如果打开不了,就把错误码记录到错误码的变量中 //errno: Last error number - C语言提供的全局的错误变量if(
==
//errno - 必须包含的头文件#include
NULL
) printfpFile ( "Error opening file unexist.ent: %s\n",
{
strerror()) ;returnerrno1;}
//读文件 fclose(
)
;
=NULLpFile;return
pFile 0 ;}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)