Search code examples
c++caesar-cipherbus-error

I continually get a "Bus Error" while this is code is being executed?


The purpose of this code is to take a file that has been passed into the program and generate the letter frequency of each letter in the file. In above code, I remove punctuation and convert to lowercase letters.

#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;
}

When I run this code I get some accurate frequencies, and some horribly incorrect ones (seems like every other result is wrong, yet after a few letters it trails off into astronomically large numbers). Any way to do this better? what is wrong with this code? As per request I have added some more of the code (including a string with a random 100 in it) as it was apparently not clear enough)

For more context, this program is for a Ceasar shift decoder I'm working on. I am in basic c++ and would greatly appreciate any advise from you more experienced devs. thank you!


Solution

  • In your program, this statement:

    count[fileContent[f]]++;
    

    should be:

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

    If you do not do -97, it is trying to increase the value at index fileContent[f] of count array, which may be beyond the limit of count array.

    Also, make sure to continue in both the if blocks and you don't need to do f++ explicitly in both the if blocks as in the for loop you are already doing f++.