/ / Einlesen von Wörtern in ein dynamisch zugewiesenes Array, das auf eine Struktur zeigt - c ++, Arrays, Zeiger, struct, dynamic-arrays

Einlesen von Wörtern in ein dynamisch zugewiesenes Array, das auf eine struct - c ++, Arrays, Zeiger, struct, dynamische Arrays verweist

Ich versuche, die Zeichenfolge zu übernehmen, die der Benutzer eingibtDieser räumt es dann ein wenig auf und speichert Wort für Wort in einem dynamisch zugewiesenen Array. Das Array zeigt auf eine Struktur. Ich versuche, das Array in der "englischen" Strukturvariablen zu speichern.

Folgendes habe ich mir ausgedacht, aber wenn ich den Code ausführe, zeigt mein Test-Cout des Arrays keine Ausgabe, sodass ich das Gefühl habe, dass die Wörter nicht in das Array kopiert werden.

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

Antworten:

0 für die Antwort № 1

Das Problem liegt darin, wie Sie versuchen zu schreibendie Daten in die dynamisch zugewiesene Word * temp-Variable sowie die dafür verwendete for-Schleife. Der obige Code muss wie folgt korrigiert werden

Ich erschaffe ein Main Array von Strings, die von der Funktion zurückgegeben werden

//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;

Die for-Schleife sollte bis zur Länge des Satzes und nicht nur bis zur Anzahl der Wörter wiederholt werden

 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;

Abgesehen davon müssen Sie sich auch kümmernMehrere Leerzeichen, Leerzeichen am Anfang und am Ende der Benutzereingabezeichenfolge in unserer Funktion, die die Anzahl der Wörter berechnet. Ihre aktuelle Implementierung kümmert sich nicht darum.