2016-10-12 1 views
0

Ich mache eine Schulaufgabe, in der ich aus einer Datei in ein dynamisch zugewiesenes Array von Strukturen lesen muss. Ich kann nur C-Stil-Zeichenfolgen und Zeiger-Array-Syntax (d. H. * (Zeiger + x)) für alle Arrays verwenden. Ich bin an einem Punkt angelangt, an dem ich versuche, alles in ihre Spots zu laden, aber wenn ich das tue, ist immer Müll am Ende meiner Variable. Wie behebe ich dieses Problem?Ich bekomme am Ende meines C-Strings eine Reihe zusätzlicher Zeichen

#include <iostream> 
#include <fstream> 
#include <cstdlib> 

using namespace std; 

struct Pieces 
{ 
    char* word; 
    int jump; 
}; 

void reset(char*, int); 
int strLen(char*); 
void createArr(char*, char*); 

int main() 
{ 
    Pieces* cip; 
    char* temp; 
    ifstream input; 
    int numWords, numKeys; 

    temp = new char[20]; 
    input.open("Project4Data.txt"); 
    input >> numWords; 
    input >> numKeys; 
    cip = new Pieces[numWords]; 
    for(int x = 0; x < numWords; x++) 
    { 
     int tempSize; 
     reset(temp, 20); 
     input >> temp; 
     tempSize = strLen(temp); 
     //cout << temp << " "; 
     (cip + x)->word = new char[tempSize]; 
     //cout << tempSize; 
     reset((cip + x)->word, tempSize); 
     createArr((cip + x)->word, temp); 
     input >> (cip + x)->jump; 
     //cout << (cip + x)->word<< << endl; 
    } 
    input.close(); 

    //cout << (cip + 2)->word; 
    delete[] cip; 
    return 0; 
} 

int strLen(char* word) 
{ 
    int s = 0; 
    //cout << word; 
    for(int x = 0; *(word + x) != '\0'; x++) 
     s++; 
    return s; 
} 

void reset(char* arr, int size) 
{ 
    for(int x = 0; x < size; x++) 
     *(arr + x) = '\0'; 
} 

void createArr(char* a, char* b) 
{ 
    reset(a, strLen(b)); 
    for(int x = 0; x < strLen(b); x++) 
     *(a + x) = *(b + x); 
     cout << a; 
} 

Als ich senden (KVP + x) - -> Wort und Temp zu createArr so dass die gültigen Inhalte Temp kann auf (KVP + x) kopiert werden > Wort, * (cip + x) -> Wort kommt immer mit einer Tonne Müll am Ende heraus, obwohl ich alles darin auf null setze und nur die ersten paar Indizes benutze. Wie behebe ich das?

Die Datendatei hat diese Informationen über sie:

Java 2 Linux 3 Furcht 0 Pool 2 0 rot 1 Schloss tun. 1 Ich 0 zufällig 2 Computer, 0 nicht 0 die 0 öffnen 2 Auto! 2 C, 0 fehlt 0 von 0 Hund 1 grün 2 C++ 0 Flasche 2 falsch, 2 sie. 0

+1

In 'createArr' geht mit' x <= strLen (b) 'dem 0-char Terminator zu kopieren. Oder fügen Sie am Ende des 'for'-Zyklus ein '* (a + strLen (b)) = 0' ein. Stellen Sie sicher, dass 'a' genügend Speicherplatz hat und verwenden Sie besser eine lokale Variable, um die Länge von' b' zu speichern, anstatt sie jedes Mal zu wiederholen, wenn Sie ihre Länge benötigen. –

Antwort

0

C-Stil-Strings sind null-terminiert, daher muss das Zeichen nach dem letzten druckbaren Zeichen gleich 0 oder '\ 0' sein. Sie können dies manuell nach der Schleife einstellen, oder tun Sie, wie Adrian sagte und ersetzen Sie die weniger als mit einem weniger als/gleich.

void createArr(char* a, char* b) 
{ 
    reset(a, strLen(b)); 
    for(int x = 0; x < strLen(b); x++) 
     *(a + x) = *(b + x); 
     *(a + x) = *(b + x); 
     cout << a; 
} 

oder (wahrscheinlich ordentlicheres)

void createArr(char* a, char* b) 
    { 
     reset(a, strLen(b)); 
     for(int x = 0; x <= strLen(b); x++) 
      *(a + x) = *(b + x); 
      cout << a; 
    } 
Verwandte Themen