【问题标题】:Segmentation Fault while implementing my own strstr() function实现我自己的 strstr() 函数时出现分段错误
【发布时间】:2016-06-27 23:53:48
【问题描述】:

我试图实现 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)

请帮我解决分段错误。

【问题讨论】:

  • 在调试器下运行代码beej.us/guide/bggdb
  • 总是用gcc -Wall -Wextra -Werror ... 编译。然后用gdb 运行你的程序。
  • 我调试了@Jonathon,返回地址时正在转储内核。
  • 你试过 cppcheck 了吗?该工具能够读取您的源代码并检测潜在的错误。另一个有用的工具可能是 valgrind。祝你好运!
  • 感谢您的提示@orbitcowboy,我开始使用 cppcheck。

标签: c string segmentation-fault strstr


【解决方案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);
 ^

【讨论】:

  • 是的,可以解决问题,感谢您的帮助 Taywee :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
相关资源
最近更新 更多