0

I am writing a program that will input an alphabetic message, and use the class to build the morse code string, and then output the string. I have written all the method and the program compiles fine. However when I enter the temp string and hit return. I am given a segmentation fault. I can't seem to find the problem. If anyone can see what the problem is I would greatly appreciate your help. Thanks.

#include <string>
#include <vector>
#include <fstream>

using namespace std;

class Code
{
public:
  Code();  // Default constructor - loads and uses morse code
  string decode(vector< string> message);  // decodes a message 
  string encode(vector<char> message); // encodes a message

private:
  vector<string> codewords; // this is a codeword vector parallel to A-Z
  vector<char> alpha; // this is the vector for A-Z
  vector<char>  alphacode(); // function builds the vector alpha - A B C etc.
  vector<string>  morsecode(); // function builds the vector codewords containing morse code
  char decode(string c); //returns the character for the codeword c.
  string encode(char c);
};

Code::Code() {
    alpha = alphacode();
    codewords = morsecode();
}

string Code::decode(vector< string> message) {
    string temp;
    for (int i=0; i < message.size(); i++) {
        temp += decode(message[i]);
    }
    return temp;
}


string Code::encode(vector<char> message)
{
    string temp;
    for (int i=0; i<message.size(); i++)
    {
        temp+=encode(message[i]);
    }
    return temp;
}

vector<string> Code::morsecode()
{ // This function returns a vector containing the morse code
 vector<string> temp(28);
 temp[0] =".-";
 temp[1] ="-...";
 temp[2] ="-.-.";
 temp[3] ="-..";
 temp[4] =".";
 temp[5] ="..-.";
 temp[6] ="--.";
 temp[7] ="....";
 temp[8] ="..";
 temp[9] =".---";
 temp[10] ="-.-";
 temp[11] =".-..";
 temp[12] ="--";
 temp[13] ="-.";
 temp[14] ="---";
 temp[15] =".--.";
 temp[16] ="--.--";
 temp[17] =".-.";
 temp[18] ="...";
 temp[19] ="-";
 temp[20] ="..-";
 temp[21] ="...-";
 temp[22] =".--";
 temp[23] ="-..-";
 temp[24] ="-.--";
 temp[25] ="--..";
 temp[26] =".......";
 temp[27] ="x";
 return temp;
}

vector<char> Code::alphacode()
{// This returns a vector containing the alphabet a-z and " "
 vector<char> temp;
 for (char c='A'; c<='Z'; c++)
      temp.push_back(c);
 temp.push_back(' ');
 temp.push_back('.');
 return temp;
}

char Code::decode(string c)
{
    for (int i = 0; i < alpha.size(); i++) {
        if(c == codewords[i]) {
            return alpha[i];
        }    
    }
}

string Code::encode(char c)
{
    for (int i=0;i<codewords.size();i++)
    {
        if (c==alpha[i])                
        {
            return codewords[i];                    
        }
    }
}
int main()
{

 vector<char> message;   
    string temp; 

    getline(cin, temp);  
        for (int i=0; i <temp.length(); i++)
        {
            message.push_back(temp[i]);
        }

    Code C;
    cout << C.encode(message) << endl;
}

2 Answers 2

1

Your alphacodes and morsecodes are only for Capital letters, so this function returns null resulting in problems.

string Code::encode(char c)
{
    for (int i=0;i<codewords.size();i++)
    {
        if (c==alpha[i])                
        {
            return codewords[i];                    
        }
    }
}

Your check for c==alpha[i] should either check ignoring the case or your alpha codes should have small alphabet codes as well. Your morsecodes should have the codes for small alphabets as well and your checks where you map A-Z to 0-28 should accommodate small letters.

Remember, small letters have different ASCII codes than Capital letters.

Sign up to request clarification or add additional context in comments.

Comments

0

The following function does not have a return statement at the end.

string Code::encode(char c)
{
    for (int i=0;i<codewords.size();i++)
    {
        if (c==alpha[i])                
        {
            return codewords[i];                    
        }
    }

    // What should happen if execution gets to this line?
}

If, per chance, your code reaches the end of the function, you will run into undefined behavior. That could be the source of your problem.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.