@start_of_my_way

Segmentation fault (core dumped) как пофиксить?

Напишите программу, печатающую гистограммы частот встречаемости вводимых
символов.
Вот как я пытался решить (пока просто заполнить массивы):
#include <stdio.h>
#define LIM 100 

int main() 
{
  char symbols[LIM]; // здесь будем хранить наши символы 
  int frequency[LIM]; // а здесь частоту этих символов
  int i;
  for (i = 0; i < LIM; i++)
    frequency[i] = 0;

  int c;
  int j = 0; // расположение последнего существующего символа в symbols[]
  while ((c = getchar()) != EOF) {
    for (i = 0; i <=j; i++){
      if (c == symbols[i]) // если символ есть в symbols[] то просто увеличиваем frequency[]
        frequency[i]++;
      else if (c != ' ' && c != '\t' && c != '\n') {// если нет, то добавляем симво в 
                                                    // symbols[] и увеличиваем frequrncy[]
        symbols[j] = c;
        frequency[j]++;
        j++;
      }
    }
  }
  
  for (i = 0; i <= j; i++) // выводим результат
    printf("\n%c = %d", symbols[i], frequency[i]);
}

Результат:
61e2b58984171823713362.png
Что я делаю не так?
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Пройдитесь по коду отладчиком. Ну, или добавьте отладочный вывод: например, в начале цикла while и цикла for выводите, что происходит итерация цикла и переменные c,i такие-то.

Вы быстро заметите, что у вас цикл по for выполняется на первом же символе более 100 раз. Посмотрите в свой код, подумайте, почему так происходит.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@start_of_my_way Автор вопроса
Wataru Спасибо, переделал, вроде работает
#include <stdio.h>
#define LIM 100

int main() 
{
  char symbols[LIM];
  int frequency[LIM];
  int i;
  for (i = 0; i < LIM; i++)
    frequency[i] = 0;

  int c;
  int j = 0;
  int exist;
  while ((c = getchar()) != EOF) {
    for (i = 0; i < LIM; i++){
      if (c == symbols[i]){ 
      exist = 1;
      break;
      }
      else  {
        exist = 0;
      }
    }
    if (exist == 1)
      frequency[i]++;
    else if (c != ' ' && c != '\t' && c != '\n'){ 
        symbols[j] = c;
        frequency[j]++;
        j++;
  }
  }

  for (i = 0; i < j; i++)
    printf("\n%c = %d", symbols[i], frequency[i]);
  printf("\n");
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Синтелс Москва
от 150 000 ₽
.White Code Санкт-Петербург
от 420 000 до 480 000 ₽
Radiofid Санкт-Петербург
от 80 000 до 110 000 ₽