分段在实现我自己的strstr()函数时出错

时间:2016-06-27 23:53:49

标签: c string segmentation-fault 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;
}

第二种方式是接收数组作为指针

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 个答案:

答案 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);
 ^