增加2D数组值崩溃程序

时间:2015-08-08 06:00:37

标签: c arrays

我在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)。如果我对该线路进行评论,那么一切都会顺利通过。 可能导致这种情况的原因是什么?

3 个答案:

答案 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代码中有小写和大写字母的代码。

而且你也没有空间''最多有错误。