[英]Augmenting 2D array value crashes program
我正在C語言中創建一個字母頻率計數器,該計數器跟蹤一個給定字符串中一個字符使用了多少次。 當程序循環遍歷每個字符時,一個2d數組會跟蹤數據:
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)。 如果我注釋掉該行,一切都會順利進行。 是什么原因造成的?
輸入語句包含大寫和小寫字母以及空格,但是您的letterfrequencies
數組僅包含小寫字母。 所以,想想當你有一個大寫字母或空格會發生什么,搜索它,它不會被發現,因此while
就繼續出去導致未定義行為的數組的邊界。
使用isspace
功能檢查空間,並使用tolower
capical字母轉換為小寫字母。
處理空格字符時出現問題,應檢查字符是否為(小寫)字母。
附帶說明一下,您不需要二維數組即可存儲字母的頻率。 而是使用:
int letterfrequencies[26] = {0};
假設字母為currentchar
,則遞增letterfrequencies[currentchar - 'a']
。 例如,如果字母為'z'
,則letterfrequencies[25]
會增加,因為'z' - 'a'
為25
。
變量letternum大於25 ...因為您在輸入中有例如“ T”,然后您在while循環字符中進行比較...因此它將字符轉換為代碼,因此它看起來像while(84 == 97)
等。 在ASCII代碼中,有小寫和大寫字母的代碼。
而且您那里沒有空間''最多有一個錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.