[英]Recreate the strstr() function
您好,我正在尝试创建自己的strstr()
函数,但我无法弄清楚为什么它会返回分段错误。我正在尝试在另一个字符串中搜索一个字符串,然后返回指向第一个“相同”字母的指针。 任何帮助,将不胜感激。 这是我的代码:
char* ms_search(char *Str1,char* Str2){
char* p = NULL;
int i,k=0,j = 0;
for(i = 0;i < ms_length(Str1); i++){
if(Str1[i] == Str2[k]){
if(k == 0){
p = &Str1[i];
j= i;
}
if(k == ms_length(Str2)){
break;
}
k++;
}
else{
if(Str1[i] == Str2[0]){
p = &Str1[i];
k=1;
j= i;
}
else{
j=0;
k = 0;
p = NULL;
}
}
}
if(p != NULL){
Str1[ms_length(Str2)+1] = '\0';
}
return &Str1[j];
}
int main(){
int i;
char* p2;
char* p="lolaaa";
char* p1= "aaa";
//char ar2[] = "aaa4";
//ms_copy(p,p1);
//printf("%s",p);
//ms_nconcat(p,p1,3);
//if(ms_ncompare(p,p1,3) == 1) printf("einai idia");
p2 = ms_search(p,p1);
printf("%s",p2);
return 0;
}
你好,我正在尝试制作自己的 strstr()
首先你必须遵循C标准。
C89/C99原型是:
char *strstr(const char *s1, const char *s2);
标准strstr()
函数不会更改传递的缓冲区。
该功能被描述为:
strstr()
函数定位s2.
指向的字符串中字符序列(不包括终止空字符)在s1
指向的字符串中的第一次出现。
strstr
函数返回指向所定位字符串的指针,如果未找到该字符串,则返回空指针。 如果s2
指向长度为零的字符串,则函数返回s1
。
在标准 C 中,这可以实现为:
#include <string.h> /* size_t memcmp() strlen() */
char *strstr(const char *s1, const char *s2)
{
size_t n = strlen(s2);
while(*s1)
if(!memcmp(s1++,s2,n))
return (char *) (s1-1);
return 0;
}
独立实现如下:
#include <stdio.h>
char *strstr1(const char *str, const char *substring)
{
const char *a;
const char *b;
b = substring;
if (*b == 0) {
return (char *) str;
}
for ( ; *str != 0; str += 1) {
if (*str != *b) {
continue;
}
a = str;
while (1) {
if (*b == 0) {
return (char *) str;
}
if (*a++ != *b++) {
break;
}
}
b = substring;
}
return NULL;
}
int main (void)
{
char string[64] ="This is a test string for testing strstr";
char *p;
p = strstr1 (string,"test");
if(p)
{
printf("String found:\n" );
printf ("First occurrence of string \"test\" in \"%s\" is:\n%s", string, p);
}
else
{
printf("String not found!\n" );
}
return 0;
}
输出:
String found:
First occurrence of string "test" in "This is a test string for testing strstr" is:
test string for testing strstr
您的独立 strstrl 是正确的。 我有我的喜好,你有你的。 两者都不完美。 你比较喜欢
if ( *b == 0 ) {
return (char *) s1;
}
我更喜欢
if ( ! *b ) return (char *) s1;
你比较喜欢
str += 1;
我更喜欢
str++;
你比较喜欢
while (1)
我更喜欢
for (;;)
如果我用我的偏好重写你的 strstrl,我们得到
char *strstr1(const char *str, const char *substring)
{
const char *a, *b = substring;
if ( !*b ) return (char *) str;
for ( ; *str ; str++) {
if (*str != *b) continue;
a = str;
for (;;) {
if ( !*b ) return (char *) str;
if (*a++ != *b++) break;
}
b = substring;
}
return NULL;
}
请注意,此版本具有相同的代码段
if ( ! *b ) return (char *) str;
在两个位置。 我们可以重新安排只做一次测试吗?
请注意当前导字符匹配时我们如何进行两个测试
if ( *str != *b )
稍后再次使用相同的铅炭
a = str ; if ( *a++ != *b++)
我们可以重新安排它来做一个测试吗?
我对你的独立 strstr 的重写如下。 它可能不是您的风格,但它在很多方面与您的独立 strstr 相似。 我的重写更短,而且我想相信更容易理解。
char *strstr(const char *str, const char *substring)
{
const char *a = str, *b = substring;
for (;;) {
if ( !*b ) return (char *) str;
if ( !*a ) return NULL;
if ( *a++ != *b++) { a = ++str; b = substring; }
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.