-3

I trying to implement strstr(str, substr) function. i tried implementing in two ways, my main goes like this

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

one way is by receiving arrays as arrays itself in the my_strstr(str, str) function

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

2nd way is receiving arrays as pointers

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

Test case:

Enter the 1st string
Amarstar
Enter the sub string
star

output for both ways:

Segmentation fault (core dumped)

Please help me out for resolving the segmentation fault.

1 Answers1

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

This is wrong. You're passing a char into a %s format. This is the issue, because it's treating the value of the first pointed character as an address.

Change it to

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

In the future, when trying to figure out an issue, allways compile with -Wall and probably -Wextra. They would have spit out this issue:

% 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);
 ^
Taywee
  • 1,313
  • 11
  • 17