2015-08-08 34 views
0

我在C中創建了一個字母頻率計數器,用於跟蹤給定字符串中字符的使用次數。二維數組跟蹤數據,而該程序循環遍歷每個字符:擴大二維數組值的崩潰程序

char* input = "The cat jumped over the fence"; 
int inputlength = (int) strlen(input); 

//keeps track of how many times each character is used 
int letterfrequencies[26][2] = { 
    {'a',0}, 
    {'b',0}, 
    {'c',0}, 
    {'d',0}, 
    {'e',0}, 
    {'f',0}, 
    {'g',0}, 
    {'h',0}, 
    {'i',0}, 
    {'j',0}, 
    {'k',0}, 
    {'l',0}, 
    {'m',0}, 
    {'n',0}, 
    {'o',0}, 
    {'p',0}, 
    {'q',0}, 
    {'r',0}, 
    {'s',0}, 
    {'t',0}, 
    {'u',0}, 
    {'v',0}, 
    {'w',0}, 
    {'x',0}, 
    {'y',0}, 
    {'z',0} 
}; 
int currentchar=0; 
int letternum=0; //character position in char counting array 
for (int i=0; i<inputlength; i++) { 
    currentchar=input[i]; 
    letternum=0; 
    while (currentchar!=letterfrequencies[letternum][0]) { 
     letternum++; 
    } 
    printf(" Found a character "); 
    letterfrequencies[letternum][1]++; //Add to char counting array 
    printf("\n"); 
} 

環路(我使用的是破發點Xcode調試),一切都按預期工作的第一次迭代。然而,在第一次迭代之後,該行:

letterfrequencies[letternum][1]++; 

崩潰程序,說線程1:EXC_BAD_ACCESS(代碼= 2,地址= 0x7fff5fc2e84c)。如果我評論這條線,一切都會順利進行。 這可能是什麼原因造成的?

+3

想當'currentchar'是一個空格時會發生什麼。您的代碼調用未定義的行爲。如果在'letterfrequencies'中找不到'currentchar',你應該採取一些措施。 –

+0

僅僅是輸入a-z嗎? – BLUEPIXY

+0

@Cool修復它的人。 – TheInnerParty

回答

2

輸入句子包含大寫和小寫字母以及空格,但letterfrequencies數組只包含小寫字母。因此,想想當你有一個大寫字母或空格時會發生什麼,並且搜索它,它不會被發現,因此while將繼續並且超出你的數組界限,導致未定義的行爲

使用isspace函數檢查空格,並使用tolower將標準字母轉換爲小寫字母。

2

當你處理空格字符時,問題就會上升,你應該檢查字符是否是(小寫)字母。


作爲一個附註,你不需要一個二維數組來存儲字母的頻率。相反,使用:

int letterfrequencies[26] = {0}; 

假設信currentchar,增加letterfrequencies[currentchar - 'a']。例如,如果字母爲'z',則letterfrequencies[25]增加,因爲'z' - 'a'25

0

變量letternum大於25 ...因爲你有例如在輸入'T',然後你在比較while循環字符...所以它正在改變字符代碼,所以它看起來像while(84 == 97)和等等。在ascii代碼中有小字母和大寫字母的代碼。

而且你也沒有空間「最多有一個錯誤。