0

我正在深入研究 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()返回 a (char*) str,我必须将此返回值存储在char指针变量中,对吗?

4

2 回答 2

5

如果my_strchr在字符串中找不到字符,则返回NULL.

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

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

if (b != NULL) {
  printf("Character found! %c\n", *b);
} else {
  printf("Not found...\n");
}
于 2016-12-28T14:44:52.517 回答
0

有一些像 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

实时调频!!!1.3.4 字符串常量中的 char* 部分

总之祝你学习顺利。

于 2016-12-28T15:07:23.057 回答