Jonathan Gabler Jonathan Gabler - 27 days ago 8
C++ Question

Reading in words to a dynamically allocated array pointing to a struct

Im trying to take the string the user enters which will then clean it up a bit and store word by word in a dynamically allocated array. The array points to a struct. Im trying to store the array in the "English" struct variable.

Here is what i came up with but when i run the code my test cout of the array shows no output so i feel as the words are not being copied to the array.

//This program will take in a English sentence from the user where it will then store the string in an dynamically allocated array
//where it will be run through a functions which will convert the English sentence to pig Latin. The
//final sentence will be displayed to the screen for the user to see.

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

struct Word{
string english;
string piglatin;
};

Word * sentenceSetup(string, int &);




int main()
{
int Size=1;//default how many words in the sentence.

string userSent;

//ask the user for a sentence they want to convert
cout<<"Hello, please enter a string to convert to PigLatin: "<<endl;
getline(cin, userSent);


Word * arr = sentenceSetup(userSent,Size);
for (int i=0; i<Size;i++)
{
cout<< arr[i].english<<endl;
}

return 0;

}

//**************************************************************
//sentenceSetup Definition: In this function we will be asking *
//the user to enter in a string which then will be counted *
//for how many words it has and creating an array of structs *
//big enough to hold that string. The array will then be *
//returned to the calling function. NOTE: This function should *
//remove all capitalization and special characters except for *
//the end period, exclamation mark, or question mark. *
//**************************************************************

Word * sentenceSetup(string userSent, int &size)
{

char nextCharacter;

//check the input for any unwanted special characters not listed in the function def.
for( int i=0; i<int(userSent.size()); i++)
{
nextCharacter = userSent.at(i);
if(ispunct(userSent[i]))
{

userSent.erase(i--, 1);
}
}

//change the whole sentence to lower case
for (int i=0; i<int(userSent.size()); i++)
{
userSent[i]=tolower(userSent[i]);
}

//Check each character in the string to see if it is a space. If the loop
//notices a space then a space equals a word in the string.
for (int i =0; i<int(userSent.size());i++)
{

nextCharacter = userSent.at(i); //Reads the character
if(isspace(userSent[i]))
{

size++;

}


}

//test to see if num count works
cout<<"There is "<<size << " words in the sentence."<<endl;
//test to see if special characters removed
//cout<<userSent<<endl;


//allocate an array to store the words in for the struct Word
Word *temp= new Word[size];
int count =0;
string word;
for(count=0;count<size;count++)
{
if(isspace(userSent[count]))
{

word =userSent.substr(0,count);
temp[count].english=word;
userSent.erase(0,count);
}


}


//test
for(count =0; count<size;count++)
{
cout<<temp[count].english;
}
return temp;
}

Answer

The problem lies in how you are trying to write the data into dynamically allocated Word* temp variable as well as the for loop you are using for the same. The above code needs to be rectified as follows

I'm creating a main array of strings which will be returned by the function

//allocate an array to store the words in for the struct Word
    Word *main= new Word[size];
    int count =0;
    string word;
    //Variable to keep track of start of each word
    int start_count =0;
    //Create a temp pointer to iterate through the memory allocated for each word
    Word *temp = main;
    //Variable to keep track of length of each word
    int bytes_to_cpy =0;

The for loop should loop until the length of the sentence, not just the number of words

 for(count=0;count<=userSent.length();count++){

        if(isspace(userSent[count]))
        {
        //Copy the required bytes as a substring
            word =userSent.substr(start_count,bytes_to_cpy);
            //Copy the word to the main array
            temp->english=word;
            //Increment the pointer;
            temp++;
            //Ignore the white space for the next word
            start_count=count+1;
            //Reset the length of the word
            bytes_to_cpy=0;
        }
    //Count the length of the word
    bytes_to_cpy++;
    }

    //Add the last word to the array
    word =userSent.substr(start_count,userSent.length()-start_count);


    temp->english = word;
    temp = main;

    //test

    for(count =0; count<size;count++)
    {
        cout<<temp->english<<endl;
    temp++;
    }
    return main;

Apart from this, you also need to take care of multiple whitespaces, whitespace at the beginning and at the end of the user input string in our Function that calculates the number of words. Your current implementation does not take care of these.

Comments