繁体   English   中英

谁能帮助我了解此strchr()C分段错误?

[英]Could anyone help me to understand this strchr() C Segmentation fault?

我正在研究C语言中的指针和字符串,但我仍然习惯于一些概念。 我出于学习目的,尝试实现了strchr()函数的一个版本strchr()与string.h中的版本相同strchr() ,但是一些基本内容仍然不正确。

这是我的代码:

#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指针变量中,对吗?

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

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

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

if (b != NULL) {
  printf("Character found! %c\n", *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的地址。 在char *中,您只需给出变量名即可。

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

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

无论如何,祝您学习顺利。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM