2016-07-08 9 views
2
ここ

は完全なコードなぜこのstrstrのインスタンスは私にセグメンテーションフォールトを与えていますか?

int count_substr(const char *str, const char *sub) 
{ 
    char *ret; 

    int a = 0; // used to tell where the pointer has moved to 
    int count = 0; 

    ret = strstr(str, sub); 

    while (strstr(ret, sub) != NULL) { 
     printf("The substring is: %s\n", ret); 

     for (a = 0; a < strlen(sub); a++) { 
      ret++; 
     } 

     printf("The substring after moving pointer is: %s\n", ret); 
     count++; 
    } 

    return count - 1; 
} 

私は、私がかつて

strstr(ret,sub) 

がゼロになるNULLポインタを使用していないよ、ここで何が起こっているか理解していないので、なぜそれは私にワンセグ障害を与えているです?

Valgrindのは

サイズの不正な読み取り1と アドレス0x0は(最近)、stack'd mallocで確保するかしないと述べているでしょうが、最初の呼び出しret = strstr(str,sub);場合はテストしていない

+5

最初の 'はstrstr()'を返す 'NULL場合'(' ret'では)whileループで 'strstr(NULL、...)'を呼び出しています。 – dhke

答えて

6

をfree'd成功する。

NULLが返された場合、次のコールstrstr(ret,sub)は確実に未定義の動作を呼び出します。

さらに、あなたのコードがwhileループで正しくretを更新しません、あなたは、単に試合の長さによって、それを進めない、試合過去の最初の文字にretを設定する必要があります。ここでは簡単なバージョンは次のとおりです。

int count_substr(const char *str, const char *sub) { 
    /* returns the number of non overlapping matches of sub in str */ 
    const char *ret = str; 
    int count = 0; 

    if (ret && sub && *sub != '\0') { 
     while ((ret = strstr(ret, sub)) != NULL) { 
      ret += strlen(sub); 
      count++; 
     } 
    } 
    return count; 
} 
+1

ありがとうございます。retがnullであるかどうかを確認するifを配置して問題を解決しました。 – user2519193

+0

「ret」をマッチの前に移動しないため、あなたの解決策がまだうまくいかないことが恐れられます。 – chqrlie

+0

'ret'を導入する必要はありません。コードは 'str'で直接うまく機能することができます。 – alk

0

あなたは間違いなく((3)のマニュアルはstrstrを)はstrstrの戻り値をチェックする必要があります

RETURN VALUE 
     These functions return a pointer to the beginning 
     of the located substring, or NULL if the substring is not found. 
関連する問題