2017-07-18 161 views
1

爲什麼我的代碼有分段錯誤?我正在嘗試查看字符串中是否有兩個相同的字母。但是它怎麼會出現分段錯誤?分段錯誤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 ++)' – Tyger

+0

下面是一個替代:使256'bool's陣列。將數組初始化爲false。將'word'中的每個字符作爲'unsigned char'逐個檢查,如果字符索引處的'bool'不正確,則將其設置爲true。如果bool是真的,你有一個重複的,可以返回true。如果您在不返回true的情況下將其置於'word'的末尾,則返回false。 – user4581301

+0

使用std :: string。 – 2017-07-18 07:01:32

回答

0

你有意包括我在你Ĵ或者是偶然?

參考:

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

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

牢記一些賽格故障有內存管理問題,而不是邏輯的問題。檢查以確保您的sizeof操作符正常,這就是我通常搞砸

0

這裏有一個錯字:

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

,你寫i,而不是j,這意味着你的循環將永遠不會停止。
在陣列之外讀取是不確定的,而且由於運氣不好,你得到了崩潰,而不是看起來工作的東西。

由於循環條件,在內循環中的兩個條件中,沒有任何意義(j == lengthi == length)。
第三個只會讓你對第一個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; 
}