实现我自己的 strstr() 函数时出现分段错误

Segmentation Fault while implementing my own strstr() function

我正在尝试实现 strstr(str, substr) 函数。我尝试以两种方式实施, 我的主线是这样的

*#include<stdio.h>

char * my_strstr(char * str, char * substr);

int main()
{
    char str[10], substr[10];

    char *ptr;

    printf("Enter the 1st string\n");
    fgets(str, 10, stdin);
    printf("Enter the sub string\n");
    fgets(substr, 10, stdin);
        printf("I'm here beofre funcall\n");
    ptr = my_strstr(str, substr);

    printf("%p  %s", ptr, *ptr);

    return 0;
}

一种方法是在 my_strstr(str, str) 函数

中接收数组作为数组本身
char * my_strstr(char str[], char substr[])
{
    int i, j, k=0, flag=0;
    char *pt = (char *)str;
    for(i=0; str[i] != '[=11=]' && substr[i] != '[=11=]'; i++)
    {
        if(str[i] == substr[0])
        {
                printf("I'm for1 %c \n", str[i]);
            for(j=i; (str[j] != '[=11=]' && substr[k] != '[=11=]'); j++)
            {
                if(substr[k] == str[i+k])
                    flag = 1;
                else
                    flag = 0;
                k++;

                printf("flag = %d \n", flag);
            }

        }
        pt++;
    }
    if(flag == 1)
        return pt;
    else
        return 0;
}

第二种方式是接收数组作为指针

char * my_strstr(char * str, char * substr)
{
    while(*str)
    {
        char * begin = str;
        char * pattern = substr;

        while(*str && *pattern && *str == *pattern)
        {
                str++;
                pattern++;
        }
        if(!*pattern)
                return begin;
        str = begin + 1;
    }
        return 0;
}

测试用例:

Enter the 1st string
Amarstar
Enter the sub string
star

两种方式的输出:

Segmentation fault (core dumped)

请帮我解决分段错误。

printf("%p  %s", ptr, *ptr);

这是错误的。您正在将 char 传递到 %s 格式。这就是问题所在,因为它将第一个指向的字符的值视为地址。

改为

printf("%p  %s", ptr, ptr);

以后在解决问题的时候,总是用 -Wall 编译,可能 -Wextra。他们会吐出这个问题:

% gcc -otest ./test.c -O0 -ggdb -Wall
./test.c: In function 'main':
./test.c:21:5: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'int' [-Wformat=]
 printf("%p  %s", ptr, *ptr);
 ^