2015-08-08 5 views
0

Я создаю счетчик частоты писем в C, который отслеживает, сколько раз символ используется в заданной строке. А 2d массив отслеживает данные, а программа перебирает каждый символ:Ошибка выполнения значения 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]++; 

сбой программы, говоря Thread 1: EXC_BAD_ACCESS (код = 2, адрес = 0x7fff5fc2e84c). Если я прокомментирую строку, все пройдет без проблем. Что может быть причиной этого?

+3

Подумайте, что произойдет, когда 'currentchar' - это пространство. Ваш код вызывает неопределенное поведение. Вы должны предпринять некоторые действия, если 'currentchar' не найден в' letterfrequencies' –

+0

Введен только a-z? – BLUEPIXY

+0

@Cool Guy, который исправляет его. – TheInnerParty

ответ

2

Вводное предложение содержит как верхние, так и строчные буквы, а также пробелы, но ваш массив letterfrequencies содержит только строчные буквы. Поэтому подумайте о том, что произойдет, когда у вас есть письмо в верхнем регистре или пробел и его поиск, он не будет найден, поэтому while будет просто продолжать и выйти за пределы вашего массива, что приведет к неопределенным поведением.

Используйте функцию isspace, чтобы проверить наличие пробелов, и используйте tolower, чтобы преобразовать буквы в строчные буквы.

2

Проблема возникает при обработке символа пробела, вы должны проверить, является ли символ (строчной) буквой.


В качестве примечания стороны вам не нужен 2-й массив для хранения частотных букв. Вместо этого используйте:

int letterfrequencies[26] = {0}; 

Предполагая, что письмо currentchar, увеличиваем letterfrequencies[currentchar - 'a']. Например, если буква 'z', letterfrequencies[25] увеличивается, потому что 'z' - 'a' - 25.

0

Переменный период времени больше 25 ... потому что у вас есть, например, «Т» на входе, а затем вы сравниваете символы цикла while ... поэтому он меняет символы на код, поэтому он выглядит как while(84 == 97) и скоро. В коде ascii есть коды для малых и прописных букв.

А также у вас нет места там, где есть ошибка.

Смежные вопросы