char *

2016-09-06 5 views
0

を返す際のセグメンテーションフォールトreturn str + i - j;に遭遇したときに、このプログラムでセグメンテーションフォルトが発生するのはなぜですか?私はポインタのコンセプトをよく理解していると思っていましたが、ここでは何かが間違っていると思います。char *

#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'しているので、あなたの* calling *コードでそれを考慮する必要があると言っています。私はそれをもっと明確にしようとします。これは、それ自体では機能に関する問題ではありません。関数の問題を確認するには、デバッグのスキルが必要です: – paxdiablo

0

すべて正常です。結局のところポインタとは無関係です、私の悪い、申し訳ありません。問題は、実際には2つの別々のファイル(main.cppとft_strstr.c)があることでした。 ft_strstr()のプロトタイプがmain.cppファイルで宣言されていないとしても、gcc main.cpp ft_strstr.cを使用してコンパイルすると、リンカーはエラーを発生させず、コンパイルされた実行可能ファイルを実行しているときにSegmentationフォールトが発生したようです。しかし、奇妙なことに、機能が実行されているということです(私はft_strstr()からいくつかのプリントを作成しようとして以来、それを知っています)。

関連する問題