谁能帮我理解这个 strchr() C 分段错误?
Could anyone help me to understand this strchr() C Segmentation fault?
我正在深入研究 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 != '[=10=]'){
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;
}
我想弄清楚为什么这是 return 分段错误。当我使用 gbd 时,它告诉我错误在最后一个 printf
,它试图打印 *b
.
一旦 my_strchr()
return 成为 (char*) str
,我必须将此 return 值存储在 char
指针变量中,对吗?
当my_strchr
在字符串中找不到字符时,它returns NULL
.
在这种情况下 b
是 NULL
所以 *b
是未定义的行为,这解释了段错误。
您可能想在打印 *b
之前检查 my_strchr
的结果,例如:
if (b != NULL) {
printf("Character found! %c\n", *b);
} else {
printf("Not found...\n");
}
tuple_cat 说的有一些逻辑问题。
但我也认为你不理解某些概念,从我的角度来看你的代码不干净。
我猜你刚开始用 c 编写代码,所以请继续编写代码:)
首先你在你的函数中 return 一个 char* 但你将函数的参数定义为
char* my_strchr(const char* str, int c)
在标准 C 中,您不能修改常量,也不能修改它,这就是声明常量的意义所在。
所以把函数改成
char* my_strchr(char* str, int c)
那么从字符串 return 一个字符的正确方法不是
return (char*)str;
但只是
return str;
在你的函数结束时。
这样您将发送 char*(字符串)中第一个字符的地址。
在 char* 中,您只需提供变量名称即可。
我鼓励您阅读:https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html
RTFM!!! 1.3.4 String Constants
中的 char* 部分
总之祝你学习顺利。
我正在深入研究 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 != '[=10=]'){
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;
}
我想弄清楚为什么这是 return 分段错误。当我使用 gbd 时,它告诉我错误在最后一个 printf
,它试图打印 *b
.
一旦 my_strchr()
return 成为 (char*) str
,我必须将此 return 值存储在 char
指针变量中,对吗?
当my_strchr
在字符串中找不到字符时,它returns NULL
.
在这种情况下 b
是 NULL
所以 *b
是未定义的行为,这解释了段错误。
您可能想在打印 *b
之前检查 my_strchr
的结果,例如:
if (b != NULL) {
printf("Character found! %c\n", *b);
} else {
printf("Not found...\n");
}
tuple_cat 说的有一些逻辑问题。
但我也认为你不理解某些概念,从我的角度来看你的代码不干净。
我猜你刚开始用 c 编写代码,所以请继续编写代码:)
首先你在你的函数中 return 一个 char* 但你将函数的参数定义为
char* my_strchr(const char* str, int c)
在标准 C 中,您不能修改常量,也不能修改它,这就是声明常量的意义所在。
所以把函数改成
char* my_strchr(char* str, int c)
那么从字符串 return 一个字符的正确方法不是
return (char*)str;
但只是
return str;
在你的函数结束时。
这样您将发送 char*(字符串)中第一个字符的地址。 在 char* 中,您只需提供变量名称即可。
我鼓励您阅读:https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html
RTFM!!! 1.3.4 String Constants
中的 char* 部分总之祝你学习顺利。