Я постоянно получаю сообщение «Ошибка шины» пока этот код выполняется?

Цель этого кода — взять файл, который был передан в программу, и сгенерировать частоту букв каждой буквы в файле. В приведенном выше коде я удаляю знаки препинания и преобразовываю их в строчные буквы.

#include<iostream>
#include<string>
#include<fstream>

using namespace std;

int main()
{
string fileContent = "qr rqh zrxog kdyh eholhyhg lq wkh odvw bhduv ri wkh qlqhwhhqwk fhqwxub wkdw wklv";

int count[26] =  { 0 }; // an array the size of the alphabet.

for(int f = 0; f < fileContent.length(); f++) // run til the file end.
{
if(fileContent[f] == 32) // to take care of the spaces.
{
f++; // also tried "continue;" and yeild different and also incorrect results.
}

if(fileContent[f] >= 48 && fileContent[f] <= 57) //take care of numbers.
{
f++; // tried "continue;"}

count[fileContent[f]]++;

}

for(int p = 0; p < 26; p++)
{
cout << char(p + 97) << ": " << count[p]  << endl;
}
return 0;
}

Когда я запускаю этот код, я получаю некоторые точные частоты, и некоторые ужасно неправильные (кажется, что любой другой результат неправильный, но после нескольких букв он затихает в астрономически большие числа). Есть ли способ сделать это лучше? что не так с этим кодом? В соответствии с запросом я добавил еще немного кода (включая строку со случайным числом 100 в нем), так как он был явно недостаточно ясен)

Для большего контекста эта программа предназначена для сдвигового декодера Ceasar, над которым я работаю. Я нахожусь на базовом c ++ и буду очень признателен за любые советы от вас более опытных разработчиков. благодарю вас!

0

Решение

В вашей программе это утверждение:

count[fileContent[f]]++;

должно быть:

count[fileContent[f]-97]++; //Assuming that all alphabets are in lowercase

Если вы не делаете -97пытается увеличить значение по индексу fileContent[f] из count массив, который может быть за пределами count массив.

Кроме того, убедитесь, что continue в обоих if блоки и вам не нужно делать f++ явно в обоих if блоки, как в for цикл вы уже делаете f++,

0

Другие решения

Вы делаете вещи сложным способом: используя массивы в стиле C, магические числа в вашем коде и рискуя переполнением буфера повсюду.

Сравните ваш код с этим:

#include <string>
#include <iostream>
#include <map>
using namespace std;

int main()
{
string fileContent = "qr rqh zrxog kdyh eholhyhg lq wkh odvw bhduv ri wkh qlqhwhhqwk fhqwxub wkdw wklv";
map<char, int> counts;

for (char ch : fileContent)
++counts[ch];

for (char ch = 'a'; ch <= 'z'; ++ch)
cout << ch << ": " << counts[ch] << '\n';
}

Или, чтобы распечатать все содержимое карты (если вы не хотите печатать 0 для букв, которых не было), вы можете использовать:

for (auto& item : counts)
cout << item.first << ": " << item.second << '\n';

Упражнение для читателя, чтобы добавить в код, чтобы исключить пробелы и числа. Подсказка: посмотрите вверх cctype заголовок.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector