2011-04-11 15 views
0

これは私が思いついたものですが、変数 'h'の周りのランタイムチェック失敗#2 - Stackが常に破損しています。ヒストグラムを使用して配列内の最も一般的な文字を見つけよう

int mostCommonLetter(char s[]) { 
    int i=0, h[26],k=0, max=0, number=0; 
    while (k < 26){ 
     h[k] = '0'; 
     k++; 
    } 
    while(s[i] != '\0'){ 
     h[whichLetter(s[i])] = h[whichLetter(s[i])]+1; 
     i++; 
    } 
    h[26] = '\0'; 
    for(i=0;h[i]!='\0';i++){ 
     if(h[i] > max) 
      number=i; 
    } 
    return number; 
} 

答えて

3

h[26] = '\0'; - hには26個の要素が0..25でインデックスされています。あなたがhの長さを知っているので、0-終了する必要はありません。for (i=0; i < 26; ++i)

また、whichLetterは常に0..25の範囲の値を返しますか?それが何であれば何をしますか?スペースに遭遇しますか?

+0

返しwhichLetter -1、それは宇宙に遭遇したとき – user133466

+0

@ user133466:これもまた壊れます - これをチェックする必要があり、戻り値が-1の場合はhを変更しないでください – Erik

1

これは、配列の末尾を越えて書き込みます:

h[26] = '\0'; 

のループを作るには、長さではなく、最後の文字に依存します。

for(i=0;i<26;i++){ 
    if(h[i] > max) 
     number=i; 
}