Ошибка сегментации при реализации моей собственной функции strstr()

Я пытаюсь реализовать функцию 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] != '\0' && substr[i] != '\0'; i++)
    {
        if(str[i] == substr[0])
        {
                printf("I'm for1 %c \n", str[i]);
            for(j=i; (str[j] != '\0' && substr[k] != '\0'); 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;
}

2-й способ - получение массивов в качестве указателей.

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)

Пожалуйста, помогите мне решить проблему сегментации.

1 ответ

Решение
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);
 ^
Другие вопросы по тегам