2016-12-28 121 views
0

我在C中潜入指针和字符串,我仍然习惯于一些概念。我试图实现strchr()函数的一个版本 - 与string.h中的一样 - 用于学习目的,但基本的东西仍然是不正确的。任何人都可以帮助我理解这个strchr()C分段错误?

这里是我的代码:

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

+3

这是发生在所有的输入,还是只有字符不出现在你的测试字符串? – usr2564301

+0

@雷克萨斯与所有输入...仍试图找出发生了什么... – ulissesBR

+2

显示您的输入。 'strchr'也可以搜索''\ 0''。 – BLUEPIXY

回答

5

my_strchr未找到字符串中的字符时,它会返回NULL

在这种情况下bNULL所以*b是未定义的行为,它解释了段错误。

你可能希望在打印*b前检查的my_strchr的结果,例如:

if (b != NULL) { 
    printf("Character found! %c\n", *b); 
} else { 
    printf("Not found...\n"); 
} 
+0

非常感谢您的回答,这就是问题所在!我解决了它添加一个if语句来测试b是否为NULL,现在就像一个魅力一样!感谢大家! – ulissesBR

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 *(字符串)中第一个字符的地址。 在一个char *中,你只要给变量名就可以做到这一点。

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

RTFM!在1.3.4字符*部分字符串常量

无论如何,祝你好运在你的学习。

+1

谢谢@Raphael,我会挖掘它。无论如何,我所关注的引用告诉我们,在传递字符串作为参数时,函数参数应该是一个常量,以避免字符串中的任何修改。 – ulissesBR

+0

没错,如果你不修改它。但那么返回一个char *有什么意义呢?如果你对它没有做任何事情,你可以检查它是否可以返回。无效或其他,但是是的,这只是为了避免编译器警告这是建议。 –

+3

这只是关于'const'正确性的坏建议。您应该阅读标准库版本的函数原型:'strchr(const char * string,int c)'。在这种情况下,'const'表示存储在'string'指向的位置的值不能被修改;但是指针本身的值可以被修改(例如,在字符串中循环)。在模拟库函数时,最好坚持标准原型并试图理解为什么要这样写。 OP正在这样做。 –

相关问题