谁能帮助我理解这个strchr()C Segmentation故障?

时间:2016-12-28 14:37:42

标签: c pointers segmentation-fault strchr

我正在深入研究C中的指针和字符串,我仍然习惯于一些概念。我试图实现strchr()函数的一个版本 - 与string.h中的相同 - 用于研究目的,但基本的东西仍然不正确。

这是我的代码:

#include <stdio.h>

char* my_strchr(const char* str, int c){
  if (str == NULL){
    printf("STR is NULL. Finishing the program\n");
    return NULL;
  }
  while (*str != '\0'){
    if (*str == c){
      return (char*) str;
    }
    str++;
  }
  return NULL;
}

int main(){
  char *a = "Hello World!";
  char *b;
  char c;

  printf("Type the character you want to find in the Hello World! string:\n");
  scanf(" %c", &c);

  b = my_strchr(a, c);

  printf("Character found! %c\n", *b);

  return 0;
}

我试图弄清楚为什么会返回分段错误。当我使用gbd时,它会告诉我错误发生在最后printf,它会尝试打印*b

my_strchr()返回(char*) str后,我必须将此返回值存储在char指针变量中,对吗?

2 个答案:

答案 0 :(得分:5)

my_strchr找不到字符串中的字符时,它会返回NULL

在这种情况下,bNULL,因此*b是未定义的行为,这解释了段错误。

您可能需要在打印my_strchr之前检查*b的结果,例如:

if (b != NULL) {
  printf("Character found! %c\n", *b);
} else {
  printf("Not found...\n");
}

答案 1 :(得分:0)

有一些像tuple_cat这样的逻辑问题。

但我也认为你不理解某些概念,从我的角度来看,你的代码并不干净。

我猜你刚开始用c编码所以继续编码:)

首先在函数中返回char *,但是将函数的参数定义为

char* my_strchr(const char* str, int c)

在标准C中,您无法触及常量,您可以修改它,以表示常量。

所以将功能更改为

char* my_strchr(char* str, int c)

然后从字符串返回char的正确方法不是

return (char*)str;

但只是

return str;

在你的功能结束时。

这样你就会发送char *(string)中第一个char的地址。 在char *中,你只需给出变量名即可。

我鼓励您阅读:https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html

RTFM !!! 1.3.4字符串常量的char *部分

无论如何,祝你好运。