c - 重新创建 strstr() 函数

标签 c pointers strstr

您好,我正在尝试创建自己的 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;
}

最佳答案

Hello i am trying to make my own strstr()

首先你必须遵循C标准。

C89/C99 原型(prototype)是:

char *strstr(const char *s1, const char *s2);

标准strstr()函数不会更改传递的缓冲区。

功能描述如下:

strstr() 函数在 s1 指向的字符串中查找字符序列(不包括终止空字符)在 s1 指向的字符串中第一次出现的位置s2。

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

关于c - 重新创建 strstr() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49131175/

相关文章:

c - 水平频率直方图出现问题

java.lang.UnsatisfiedLinkError Windows 上的 JNI 错误

C改变一个void指针代表的值

c - 由于 strlen_sse2() 导致的段错误

c - 在另一个字符串中查找字符串

php - 为什么对 strstr 的调用没有返回 false?

c - 包含一个具有两位数字值的字符

c - 在 Debug模式下获得警告但在 Release模式下没有(我会得到未定义的行为吗?)

c - 从 malloc 传递双指针获取段错误。对语法感到困惑

c - #define 多个值 - C