【问题标题】:Recreate the strstr() function重新创建 strstr() 函数
【发布时间】:2018-08-14 07:56:40
【问题描述】:

您好,我正在尝试创建自己的 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() 函数不会更改传递的缓冲区。尝试修改字符串文字会调用 未定义的行为。请描述你想做什么。
  • @Μιχάλης 函数太复杂了。与任何复杂的功能一样,它都有错误。:)
  • @Μιχάλης 您也不能更改字符串文字。
  • strstr() 使用签名char *strstr(const char *s1, const char *s2);。我建议您的代码也这样做。

标签: c pointers strstr


【解决方案1】:

您的独立 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;
}

注意这个版本的sn-p是一样的

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; }
  }
}

【讨论】:

    【解决方案2】:

    您好,我正在尝试制作自己的 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
    

    【讨论】:

      猜你喜欢
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多