我在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)。如果我对该线路进行评论,那么一切都会顺利通过。 可能导致这种情况的原因是什么?
答案 0 :(得分:2)
输入句子包含大写和小写字母以及空格,但您的letterfrequencies
数组仅包含小写字母。所以想想当你有一个大写字母或空格并搜索它会发生什么,它就不会被找到,所以while
将会继续并超出你的数组范围,导致未定义的行为。
使用isspace
功能检查空格,并使用tolower
将字母字母转换为小写字母。
答案 1 :(得分:2)
处理空格字符时问题会出现,你应该检查字符是否是(小写)字母。
作为旁注,您不需要二维数组来存储字母的频率。相反,使用:
int letterfrequencies[26] = {0};
假设该字母为currentchar
,请增加letterfrequencies[currentchar - 'a']
。例如,如果字母为'z'
,则letterfrequencies[25]
会递增,因为'z' - 'a'
为25
。
答案 2 :(得分:0)
变量letternum大于25 ...因为你在输入中有例如'T'然后你在while循环字符中进行比较...所以它将字符改为代码所以它看起来像{{1 }} 等等。在ascii代码中有小写和大写字母的代码。
而且你也没有空间''最多有错误。