任何人都可以帮助我理解这个strchr()c细分故障



我正在研究C中的指针和字符串,但我仍然适应某些概念。我尝试实现strchr()函数的版本 - 与String.h中的相同 - 用于研究目的,但基本的东西仍然不对。

这是我的代码:

#include <stdio.h>
char* my_strchr(const char* str, int c){
  if (str == NULL){
    printf("STR is NULL. Finishing the programn");
    return NULL;
  }
  while (*str != ''){
    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! %cn", *b);
  return 0;
}

我试图弄清楚为什么要返回分段错误。当我使用GBD时,它告诉我错误是在最后一个printf中,该错误试图打印*b

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

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

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

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

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

有一些逻辑问题,例如tuple_cat说。

,但我也认为您不了解某个概念,从我的角度来看,您的代码不是干净的。

我想您刚刚开始在C中进行编码,因此请继续编码:)

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

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

在标准C中,您无法触摸常数,无法修改它,这是声明常数的重点。

因此将功能更改为

char* my_strchr(char* str, int c)

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

return (char*)str;

但是只是

return str;

在您的功能结束时。

这样,您将在char*(字符串)中发送第一个字符的地址。在char*中,您只需给出变量名。

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

rtfm!char*零件为1.3.4字符串常数

无论如何,您的学习中祝您好运。

相关内容

  • 没有找到相关文章