2016-12-28 119 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正在這樣做。 –

相關問題