2016-07-29 9 views
-1

Ich schreibe einen Registry-Generator als Teil eines größeren Programms. Ich bin sehr neu in C++, aber gut in anderen Programmiersprachen wie PHP.Probleme mit Strings und Char-Arrays in C++

I, indem sie den Code der problematischen Start-Funktion werden:

void generacionAleatoria() { 
    string r_marca, r_nom, r_apellido; 
    char r_patente[6]; 

    int num_rand; 
    registroAuto r_auto; 


    string nombres[8] = { 
     "Juan", "Pedro", "Roberto", "Miguel", "Guillermo", "Emilio", "Roque", "Gustavo" 
    } ; 
    string apellidos[8] = { 
     "Messi", "Maradona", "Gardel", "Heredia", "Pimpinela", "Nadal", "Mascherano", "Troilo" 
    }; 
    string marcas[12] = { 
     "Volvo", "Renault", "Audi", "Ford", "Fiat", "Chevrolet", "Nissan", "Volkswagen", "Mercedes Benz", "Rolls Royce", "Delorean", "Aston Martin" 
    }; 

    char letras_patentes[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    char numeros_patentes[] = ""; 

    for (int i = 0; i < cantidad_autos; i++) { 
     r_marca = marcas[rand() % (sizeof(marcas)/sizeof(marcas[0]) - 1)]; 
     r_nom = nombres[rand() % (sizeof(nombres)/sizeof(nombres[0]) - 1)]; 
     r_apellido = apellidos[rand() % (sizeof(apellidos)/sizeof(apellidos[0]) - 1)]; 

     for(int m = 0; m < 3; ++m) { 
      r_patente[m] = letras_patentes[rand() % (sizeof(letras_patentes) - 1)]; 
     } 
     for(int n = 3; n < 6; n++) { 
      r_patente[n] = numeros_patentes[rand() % (sizeof(numeros_patentes) - 1)]; 
     } 

     strcpy(r_auto.patente,r_patente); 
     strcpy(r_auto.marca,r_marca.c_str()); 
     strcpy(r_auto.apellido,r_apellido.c_str()); 
     strcpy(r_auto.nom,r_nom.c_str()); 

     fwrite(&r_auto,sizeof(registroAuto),1,archivo); 

     if (ver_variables_testeo) { 
      //cout << (i+1) << ") " << r_auto.patente<<endl; 
      cout << (i+1) << ") " << r_auto.marca << " - " << r_auto.patente << " - " << r_auto.nom << " " << r_auto.apellido << endl; //Para testear 
     } 

    } 
} 

Dies schafft 100 structs der folgenden Art:

struct registroAuto { 
    char marca[15]; 
    char patente[6]; 
    char nom[25]; 
    char apellido[25]; 
}; 

Falls Sie sich fragen, ist dies bedeutete, ein Register der Uber-Fahrer und ihrer Autos zu sein: Marke, Nummernschild, Vor- und Nachname. Nun, es ist nicht wirklich eine Registry, es ist College-Hausaufgaben.

Das Problem ist, dass, wenn ich den Inhalt meiner neuen Struktur ausdrucken, das Nummernschild und der Name zusammen sein werden, wie in:

100) Fiat - KWQ293Maria - Maria Gardel

können Sie Sieh an der Position der Bindestriche, dass das Nummernschild jetzt "KWQ293Maria" ist, obwohl es ein Array von 6 Zeichen ist!

Eine Erinnerung an den cout Befehl:

cout << (i+1) << ") " << r_auto.marca << " - " << r_auto.patente << " - " << r_auto.nom << " " << r_auto.apellido << endl; 

ich einige Tests tat, aber ich weiß nicht, was mit den Ergebnissen zu tun.

1: die StrCopy des Namens Auskommen behebt das Problem

strcpy(r_auto.patente,r_patente); 
    strcpy(r_auto.marca,r_marca.c_str()); 
    strcpy(r_auto.apellido,r_apellido.c_str()); 
    //strcpy(r_auto.nom,r_nom.c_str()); 

Wie Sie sehen können, ist dies die letzte der vier Aussagen in meiner ursprünglichen Code ist, so weiß ich nicht, warum sollte es beeinflussen r_auto.patente.

Können Sie mir bitte helfen? Ich vermute, es ist ein Schlüsselbegriff der char-Array Handhabung, dass ich :-(

auf in der Klasse verpassten
+3

Ohne in depth in Ihrem Code zu suchen, kann ich sagen, dass literale Strings braucht noch einen Platz. Es ist notwendig, das Ende der Zeichenkette ('\ 0'') zu halten. In Ihrem Fall muss 'nom' eine Größe von 7 haben, um 6 sichtbare Zeichen zu enthalten (mindestens) – Amadeus

+4

Das Schlüsselkonzept der char-Array-Behandlung, das Ihnen fehlt, ist, dass Sie keine char-Arrays verwenden sollten. C++ hat 'std :: string'. Benutze es. Vermeiden Sie Pufferüberläufe. Vermeiden Sie schmerzhaftes Zählen und Berechnen von Puffergrößen. Verwenden Sie einfach 'std :: string's. Außerdem ist Ihre Zufallszahlenerzeugung kaputt. Ihr Zufallszahlengenerator wird niemals den letzten Wert aus den Arrays "Marcas", "Nombres" und "Appelidos" auswählen. –

+2

Haben Sie versucht, den Speicherinhalt dieser char-Arrays durch einen Debugger zu beobachten? –

Antwort

1

Bei der Verwendung von Zeichen-Arrays als Strings die sie benötigen, um ein Null-Zeichen beendet werden '\0'. Also, wenn Sie bauen Ihre Nummernschild müssen Sie das Array 7 Zeichen lang machen

struct registroAuto { 
    char marca[15]; 
    char patente[7]; // 6 for numbers, 1 for terminator '\0' 
    char nom[25]; 
    char apellido[25]; 
}; 

Samen mit Ihrer Arbeitsvariable.

char r_patente[7]; 

Und Sie müssen die manuell hinzufügen Null-Terminator beim Erstellen der Nummer:

for(int m = 0; m < 3; ++m) { 
     r_patente[m] = letras_patentes[rand() % (sizeof(letras_patentes) - 1)]; 
    } 
    for(int n = 3; n < 6; n++) { 
     r_patente[n] = numeros_patentes[rand() % (sizeof(numeros_patentes) - 1)]; 
    } 

    r_patente[6] = '\0'; // add the null terminator