我正在研究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
。
在这种情况下,b
是NULL
,因此*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字符串常数
无论如何,您的学习中祝您好运。