2016-09-06 46 views
0

爲什麼在遇到行return str + i - j;時,此程序會導致分段錯誤?我以爲我很瞭解指針的概念,但我顯然在這裏錯過了一些東西,我無法弄清楚。返回字符時出現分段錯誤*

#include <stdio.h> 

char* ft_strstr(char* str, char* to_find) 
{ 
    int i; 
    int j; 

    i = 0; 
    while (str[i] != '\0') 
    { 
     j = 0; 
     while (str[i] == to_find[j] && str[i] != '\0' && to_find[j] != '\0') 
     { 
      i++; 
      j++; 
     } 
     if (to_find[j] == '\0') 
      return str + i - j; 
     else 
      i = i - j; 
     i++; 
    } 
    return (0); 
} 

int main() 
{ 
    char a[] = "fffo"; 
    char b[] = "ffo"; 
    char* f = ft_strstr(a,b); 
    if (f) 
     printf("%s\n", f); 
    return (0); 
} 
+0

你沒有'return 0'嗎?這看起來很腥...... –

+1

在GCC編譯器中,你的程序工作正常.. –

+1

@cuvidk:我現在不能測試它,但是你現在的代碼看起來不錯。你可以調試它,看看'i'和'j'的值是什麼以及它們是如何改變的。 –

回答

4

如果這裏您的目的是找到另一個字符串的字符串,你應該簡單地看爲標準strstr功能,因爲這是它到底是什麼意思了。

但是,如果你的目的是學習如何調試代碼,最好的辦法是坐下來與一張紙這樣的:通過

i  j  str    to_find 
----- ----- -------------- ------------ 
        0 1 2 3 4  0 1 2 3 <- indexes 
    ?  ?  f f f o \0 f f o \0 

,並通過你的腦袋上運行的代碼,行行,隨時更新變化的變量。

沒有什麼會比通過手動單步執行代碼更清晰。

+1

我知道有一個功能已經做到了。這就是爲什麼這個功能的原型和那個相似。我只需要寫一些類似的東西,就是這樣。其次,本例中不調用'return(0)'。遇到的return語句是'return str + i - j;'。檢查與打印,你會看到。 – cuvidk

+0

關於'return(0);',它是故意放在那裏的,因爲''的'strstr'函數在沒有找到序列的時候返回NULL指針。 – cuvidk

+0

@cuvidk,我只是說,因爲你盲目'printf'的返回值,如果沒有找到字符串,這將會嚴重結束,因此我爲什麼說你的*調用*代碼應該考慮到這一點。我會盡量做得更清楚。它本身並不是一個功能問題。要確定功能的問題,你需要調試技巧,我試圖傳授:-) – paxdiablo

0

一切工作正常。這與指針畢竟無關,我的不好,抱歉。問題是我實際上有兩個單獨的文件(main.cpp和ft_strstr.c)。即使沒有在main.cpp文件中聲明ft_strstr()的原型,在使用gcc main.cpp ft_strstr.c進行編譯時,鏈接器也沒有引發任何錯誤,而且似乎在我運行編譯的可執行文件時,導致了Segmentation錯誤。但奇怪的是,該功能正在執行(我知道,因爲我試圖從ft_strstr()做一些打印)。