Probleme mit cin.getline...
-
hallo welt !
das ganze ist äußerst komisch, da es allein verwendet in einem programm problemlos funktioniert, allerdings ausgerechnet in meinem kompletten proggy sich als problem äußert...
und zwar habe ich eine funktion, die 3 strings vom user abfrägt.
allerdings hat der user keine möglichkeit, seine antwort eizugeben, da das programm schon weiter zur näxten abfrage gesprungen ist...
sehr ärgerlichkeiner glaubts mir, also poste ich mal die komplette source des programms:
#include <iostream.h> #include <string.h> const eintraege_max=100; struct person { char vorname[80]; char nachname[80]; int nr; }; person eintrag[(eintraege_max-1)]; void Anzeige(); int Zaehlen(); void Eintragen(); void Initialisierung(int todo); void Loeschen(); void Anzeige() { int i, antwort; cout << (eintraege_max+1) << ": Anzeigen aller Eintraege \n"; cout << "[0 - " << (eintraege_max-1) << "]: Anzeigen des angegeben Eintrags \n"; cin >> antwort; if(antwort==(eintraege_max+1)) { for(i=0; i<eintraege_max; i++) { if(eintrag[i].nr!=0) { cout << "Eintrag " << i << ": " << eintrag[i].vorname << ", " << eintrag[i].nachname << ", " << eintrag[i].nr << "; \n"; } } } else if(0<=antwort<=eintraege_max) { i=antwort; cout << "Eintrag " << i << ": " << eintrag[i].vorname << ", " << eintrag[i].nachname << ", " << eintrag[i].nr << "; \n"; } } int Zaehlen() { int i; int anzahl; anzahl=0; for(i=0; i<eintraege_max; i++) { if(eintrag[i].nr!=0) { anzahl++; } } return anzahl; } void Eintragen() { int i, antwort_i, letzter_eintrag; char antwort_chr[80]; letzter_eintrag=(Zaehlen()-1); i=(letzter_eintrag+1); cout << "\nNeuer Eintrag:"; cout << "\nNachname: "; cin.getline(antwort_chr,80); strcpy(eintrag[i].nachname,antwort_chr); cout << "\nVorname: "; cin.getline(antwort_chr,80); strcpy(eintrag[i].vorname,antwort_chr); cout << "\nNummer: "; cin >> antwort_i; eintrag[i].nr=antwort_i; cout << "Eintrag #" << i << " wurde erzeugt\n"; } void Initialisierung(int todo) { int i; if(todo==(eintraege_max+1)) { for(i=0; i<eintraege_max; i++) { strcpy(eintrag[i].vorname,""); strcpy(eintrag[i].nachname,""); eintrag[i].nr=0; } cout << "Eintraege wurden initialisiert; "; } else if(0<=todo<=eintraege_max) { i=todo; strcpy(eintrag[i].vorname,""); strcpy(eintrag[i].nachname,""); eintrag[i].nr=0; cout << "Eintrag " << i << " wurde gelöscht; "; } } void Loeschen() { int i, antwort; cout << (eintraege_max+1) << ": Loeschen/Initialisieren aller Eintraege \n"; cout << "[0 - " << (eintraege_max-1) << "]: Loeschen des angegeben Eintrags \n"; cin >> antwort; if(antwort==(eintraege_max+1)) { Initialisierung(antwort); } else if((antwort<=(eintraege_max-1))&(0<=antwort)) { Initialisierung(antwort); }else { cout << "ungueltige Eingabe\n"; } } void main() { Initialisierung(eintraege_max+1); int i, gezaehlt,ende=0; /* //Beispiel-Einträge: i=0; strcpy(eintrag[i].vorname,"Hans"); strcpy(eintrag[i].nachname,"Wurst"); eintrag[i].nr=1234567890; i=1; strcpy(eintrag[i].vorname,"Hans1"); strcpy(eintrag[i].nachname,"Wurst1"); eintrag[i].nr=12345678901; i=2; strcpy(eintrag[i].vorname,"Hans2"); strcpy(eintrag[i].nachname,"Wurst2"); eintrag[i].nr=123456789; */ int antwort; while(ende!=1) { cout << "\n1: " << "Eintragen \n"; cout << "2: " << "Anzeigen \n"; cout << "3: " << "Loeschen \n"; cout << "0: " << "Ende \n"; cin >> antwort; switch(antwort) { case 1: Eintragen(); break; case 2: Anzeige(); break; case 3: Loeschen(); break; default: ende=1; cout << "ENDE\n"; } char p[50]; cin.getline(p,50); cin.getline(p,50); } }
in der funktion 'Eintragen' tritt das problem auf...
einfach mal testen und den fehler nachvollziehen...VIELEN DANK für Eure hilfe
-
Verschoben nach "Konsole".
-
Vielleicht sollte man den Quellcode kürzen... dabei finden sich bestimmt einige kleinigkeiten, die man verbessern müsste, ich glaube dir nicht, dass das Programm startet, weil das Array mit eintrag[(eintrag_max-1)]; nur 99 Felder hat und du versuchst in der Schleife in der Funktion initialisieren auf 100 Felder zuzugreifen. Es gibt also einen Acces Overrun -Fehler beim BCB.
-
stimmt... aber bitte teste es mal bei Dir.
es lässt sich dennoch ausführen! ich werd dann mal den ausschnitt der source ändern...
aber das hat keinen einfluss auf mein problem !
bitte helft