2017-07-18 8 views
1

私のコードはセグメンテーションフォールトを持っていますか?文字列に2つの同じ文字があるかどうかを調べようとしています。しかし、それはどのようにセグメンテーションフォルトを持っていますか?セグメンテーションフォールトC++なぜ私のプログラムは私にセグメンテーションフォールトを与えていますか

#include<iostream> 
#include<cstring> 
using namespace std; 

bool match(char[], int); 

int main() 
{ 
    char word[20]; 
    cout << "Enter a word: "; 
    cin >> word; 
    int length = strlen(word); 
    if (match(word, length)) cout << "It has two letters that are the same" << 
     endl; 
    else cout << "There is no same letters" << endl; 
    return 0; 
} 

bool match(char word[], int length) 
{ 
    bool found = false; 
    for (int i = 0; i < length; i++) 
    { 
     for (int j = 1; i < length; j++) 
     { 
      if (j <= i || j == length || i == length) continue; 
      if (word[i] == word[j]) found = true; 
     } 
    } 
    return found; 
} 
+0

それがために 'する必要があります(int型J = 1; jの<長さ; J ++)'ここ – Tyger

+0

は、代替です:256 'bool'sの配列を作成します。配列をfalseに初期化します。 'word'の各文字を' unsigned char'として一つずつ探し、文字のインデックスの 'bool'が真でない場合は真にします。 boolがtrueの場合、重複してtrueを返すことができます。 trueを返さずに 'word'の終わりにすると、falseを返します。 – user4581301

+0

std :: stringを使用します。 –

答えて

0

あなたが意図的に私はあなたのJループでを含まれたのかということは、偶然のでしたか?

参考:

"for (int j = 1; i < length; j++)" 

Should this be: for (int j; j<length; j++)? 

は、いくつかのワンセグ障害がメモリ管理の問題だけではなく、論理的な問題を抱えているに注意してください。あなたのsizeof演算子が正しく機能しているか確認してください、それは私が通常

0

を台無しに何タイプミスがここにあります:あなたはあなたのループが停止しないことを意味し、i代わりのjを書いた

for (int j = 1; i < length; j++) 


配列外の読み込みは定義されておらず、盲目的には動作していると思われるものの代わりにクラッシュが発生します。

ループ条件のため、内部ループの条件のうち、2つは無意味です(j == lengthおよびi == length)。
3番目のコマンドは、最初のiの繰り返しには役に立ちません。
これを達成するより良い方法は、ループをi + 1で開始することによって何もしないことです。

bool match(char word[], int length) 
{ 
    for (int i = 0; i < length; i++) 
    { 
     for (int j = i + 1; j < length; j++) 
     { 
      if (word[i] == word[j]) 
      { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
関連する問題