实现我自己的 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);
^
我正在尝试实现 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);
^