Ошибка сегментации при реализации моей собственной функции 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);
^