我试图实现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;
}
第二种方式是接收数组作为指针
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)
请帮我解决分段错误。
答案 0 :(得分:4)
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);
^