我正在深入研究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
指针变量中,对吗?
答案 0 :(得分:5)
当my_strchr
找不到字符串中的字符时,它会返回NULL
。
在这种情况下,b
为NULL
,因此*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 *部分
无论如何,祝你好运。