Eingabe von Texten mit Leerschritt



  • Hi,
    ich habe das Problem, dass ich in einem Verwaltungstool die Eingabe von Texten mit Leerzeile realisieren muss. Das ist weder bei Variablen des Typs string noch bei einem Char-Array möglich. Bei jedem eingegebenen Leerschritt springt er zur nächsten Eingabe weiter.
    Hat jmd. eine Idee, wie ich das realisieren kann?
    (Habe nur mit Konsole programmiert und möchte dies auch beibehalten)



  • Das ist keine Frage des Datentyps, in den du einliest, sondern kommt auf die Einlesefunktion an. Numm std::getline statt operator<<.



  • habe ich probiert. leider bekomme ich diese fehler:

    c:\Dokumente und Einstellungen\Internet\Desktop\C++-Schulung\Programme\Abschlussaufgabe optimiert\Abschlussaufgabe mit Strings.cpp(184) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'Mitglied'
    c:\Dokumente und Einstellungen\Internet\Desktop\C++-Schulung\Programme\Abschlussaufgabe optimiert\Abschlussaufgabe mit Strings.cpp(184) : warning C4551: Dem Funktionsaufruf fehlt die Argumentliste

    hier mal meine programmierung

    getline Mitglied[Zaehler].Name;
    

    ich wollte in der hilfe nachschauen, aber die hab ich nicht mitinstalliert, und die hilfecds nicht da. Wie muss die syntax denn genau lauten?



  • getline funzt z.B. so:

    string str("");
    cout<<"Bitte geben Sie einen Satz ein: ";
    getline(cin, str);  //Liest den Satz in str rein
    cout<<"Sie haben "<<str<<" eingegeben\n";
    


  • gibt es auch die möglichkeit dies mit einem char-array zu machen?



  • also, hab das so hinbekommen...
    aber bei der eingabe überspringt er manche eingaben. (bei mir name und ort)
    woran liegt das?

    for (int Zaehler=0; Zaehler<gesNr; Zaehler++)		// Schleife erhöht den Zähler Zaehler bei jedem Durchlauf um 1
    		{	if (Mitglied[Zaehler].Name[0]==' ')	// Überprüfung, ob Name leer
    										// somit wird der erste leere Eintrag beschrieben
    			{	
    				system("cls");
    				cout << "\n\tNeues Mitglied erfassen:";
    				cout << "\n\t~~~~~~~~~~~~~~~~~~~~~~~~";
    
    				cout << "\n\nBitte geben Sie nacheinander die gefragten Daten ein.\n\n";
    
    				cout << "Name:\t\t\t";		// Eingabe der gefragten Namen
    				getline (cin, Mitglied[Zaehler].Name);
    				//cin >> Mitglied[Zaehler].Name;	// Name als char-Array
    
    				cout << "\nVorname:\t\t";
    				getline (cin, Mitglied[Zaehler].Vorname);
    				//cin >> Mitglied[Zaehler].Vorname;		// Vorname als char-Array
    
    				cout << "\nStrasse und Nr.:\t";
    				getline (cin, Mitglied[Zaehler].StrasseNr);
    				//cin >> Mitglied[Zaehler].StrasseNr;   // Strasse und Nr als char-Array, Eingabe ohne Leerzeichen!!!
    
    				do			// Schleife zur Vermeidung der Eingabe einer falschen PLZ
    				{	cout << "\nPLZ:\t\t\t";
    					cin >> Mitglied[Zaehler].PLZ;		// PLZ als int
    					if ((Mitglied[Zaehler].PLZ < 10000) || (Mitglied[Zaehler].PLZ > 99999))
    					{	cout << "\n\t\afalsche Eingabe!!!\n";
    					}
    				}
    				while ((Mitglied[Zaehler].PLZ < 10000) || (Mitglied[Zaehler].PLZ > 99999));
    
    				cout << "\nOrt:\t\t\t";
    				getline (cin, Mitglied[Zaehler].Ort);
    				//cin >> Mitglied[Zaehler].Ort;		// Ort als string
    
    				do		// Schleife zur Vermeidung der Eingabe eines falschen Geburtsjahres
    				{	cout << "\nGeburtsjahr:\t\t";
    					cin >> Mitglied[Zaehler].GebJahr;		// Geburtsjahr als int
    					if ((Mitglied[Zaehler].GebJahr < 1900) || (Mitglied[Zaehler].GebJahr > 3000))
    					{	cout << "\n\t\afalsche Eingabe!!!\n";
    					}
    				}
    				while ((Mitglied[Zaehler].GebJahr < 1900) || (Mitglied[Zaehler].GebJahr > 3000)); 
    
    				do		// Schleife zur Vermeidung der Eingabe eines falschen Geburtsmonats
    				{	cout << "\nGeburtsmonat:\t\t";
    					cin >> Mitglied[Zaehler].GebMonat;	// Geburtsmonat als int
    					if ((Mitglied[Zaehler].GebMonat < 1) || (Mitglied[Zaehler].GebMonat > 12))
    					{	cout << "\n\t\afalsche Eingabe!!!\n";
    					}
    				}
    				while ((Mitglied[Zaehler].GebMonat < 1) || (Mitglied[Zaehler].GebMonat > 12));
    
    				do	// Schleife zur Vermeidung der Eingabe eines falschen Geburtstages
    				{	cout << "\nGeburtstag:\t\t";
    					cin >> Mitglied[Zaehler].GebTag;		//Geburtstag als int
    					if ((Mitglied[Zaehler].GebTag < 1) || (Mitglied[Zaehler].GebTag > 31))
    					{	cout << "\n\t\afalsche Eingabe!!!\n";
    					}
    				}
    				while ((Mitglied[Zaehler].GebTag < 1) || (Mitglied[Zaehler].GebTag > 31));
    
    				do	// Schleife zur Vermeidung der Eingabe eines falschen Monats
    				{	cout << "\nMitglied seit (Monat):\t";
    				cin >> Mitglied[Zaehler].MitgliedMon;		// Mitgliedmonat als int
    				}
    				while ((Mitglied[Zaehler].MitgliedMon < 1) || (Mitglied[Zaehler].MitgliedMon > 12));
    
    				do	// Schleife zur Vermeidung der Eingabe eines falschen Mitgliedsjahres
    				{	cout << "\nMitglied seit (Jahr):\t";
    					cin >> Mitglied[Zaehler].MitgliedJahr;	// Mitgliedsjahr als int
    					if ((Mitglied[Zaehler].MitgliedJahr < 1900) || (Mitglied[Zaehler].MitgliedJahr > 3000)
    						|| (Mitglied[Zaehler].MitgliedJahr < Mitglied[Zaehler].GebJahr))
    					{	cout << "\n\t\afalsche Eingabe!!!\n";
    					}
    				}
    				while ((Mitglied[Zaehler].MitgliedJahr < 1900) || (Mitglied[Zaehler].MitgliedJahr > 3000)
    					|| (Mitglied[Zaehler].MitgliedJahr < Mitglied[Zaehler].GebJahr));
    
    				cout << "\nTelefonnr:\t\t";
    				cin >> Mitglied[Zaehler].Tel;		// Telnummer als string
    
    				cout << "\nBeitrag gezahlt? (j/n):\t";
    				cin >> Mitglied[Zaehler].Beitrag;		// Beitrag als char
    				if (Mitglied[Zaehler].Beitrag == 'j')	// Erhöhung des Kontostandes bei
    				{	Konto=Konto+3;				// Einzahlung des Beitrags
    				}
    
    				cout << "\nMoechten Sie ein weiteres Mitglied einlesen?\t";
    				cin >> Eingabe;	
    				if (Eingabe == 'n')		// ohne diese Abbruchbedingung läuft die
    				{	break;				// Schleife auch bei Eingabe n weiter.
    				}						// Kann mir nicht erklären, warum.
    
    			}
    
    		}
    

    und ein weiteres prob hab ich:
    ich habe ein verwaltungstool, jedesmal wenn ich das menu "Beitrag zahlen" (um die Beiträge für die einzelnen Mitglieder einzuzahlen)aufrufe, kommt direkt eine total komische ausgabe. schaut zuerst ein bisschen aus wie weihnachten (ein paar sterne) und am schluss

    ☺GetStringTypeA Á☺GetStringTypeW 7☻IsValidLocale 5☻IsValidCodePage l☺GetLo
    leInfoA Ñ EnumSystemLocalesA ┘☺GetUserDefaultLCID y♥VirtualProtect ╗☺GetSy
    emInfo {♥VirtualQuery ß☻SetConsoleCtrlHandler ▼☻InterlockedExchange R☺GetExit
    deProcess â♥WaitForSingleObject ` CreateProcessA § GetACP ï☺GetOEMCP ®☻Rea

    und ich kann mir das garnet erklären, was ich falsch haben soll. hier mal der code:

    do	// Schleife, läuft solange Eingabe gleich j
    	{
    
    	system("cls");
    	cout << "\n\tBeitrag zahlen:";
    	cout << "\n\t~~~~~~~~~~~~~~~";
    
    	for (int Zaehler=0; Mitglied[Zaehler].Name != " " && Mitglied[Zaehler].Beitrag == 'n' && Zaehler < gesNr; Zaehler++)
    	{	cout << endl << Zaehler;	// Ausgabe aller Mitglieder, deren Beitrag gleich nein ist
    		cout << " --> ";
    		cout << Mitglied[Zaehler].Name;
    		cout << ", ";
    		cout << Mitglied[Zaehler].Vorname;
    		cout << endl;
    	}
    
    		cout << "\nFuer wen soll der Beitrag eingezahlt werden?\n\n\t";
    
    		cin >> MitgliedNr;
    		if (Mitglied[MitgliedNr].Beitrag=='n')
    		{	Mitglied[MitgliedNr].Beitrag='j';
    			Konto=Konto+3;
    			if (Mitglied[MitgliedNr].Name != " ")
    			{	cout << "\n\nDer monatliche Beitrag von 3 Euro wurde fuer \n";
    				cout << Mitglied[MitgliedNr].Vorname << " ";	// wenn ungleich leer, dann wird der Name
    				cout << Mitglied[MitgliedNr].Name << " ";		// angezeigt
    				cout << "gezahlt.\n\n";
    			}
    			else
    			{	cout << "\n\nDer monatliche Beitrag von 3 Euro wurde fuer Mitglied Nr. ";
    				cout << MitgliedNr << " gezahlt.\n\n";			// ansonsten die Mitglieder Nr
    			}
    		}
    		else
    		{	cout << "\n\nDer Beitrag wurde bereits gezahlt.\n";	// Obwohl die Mitglieder, deren Beitrag schon gezahlt wurde
    					// nicht aufgezählt werden, kann man per Nummerneingabe auch diese auswählen, um den Beitrag nicht erneut
    					// einzuzahlen, diese zweiseitige Auswahl
    		}
    
    		cout << "Zahlt ein weiteres Mitglied den Beitrag ein?\t";
    		cin >> EingabeBeitrag;	// Eingabe, ob weiteres Mitglied bezahlt
    	}
    	while (EingabeBeitrag == 'j');
    
    	Menu();
    }
    


  • 1. Ob ein std::string leer ist, prüfst du besser mit

    if (str.length()==0) { //wenn "leer"
    
    }
    

    2. Dass Name und Ort übersprungen werden, liegt daran, dass vom Einlesen der Zahlen noch was im Stream liegt: das \n .
    Pack das vor das Einlesen von Name und Ort:

    while (getchar()!='\n');
    

    3. Deine Einrückung könnte besser sein, erleichtert das lesen.

    Dein anderes Problem könnte ich mir nur damit erklären, dass die Konsole kein ä ü ö usw. kann, aber mit dieser Ausgabe kann ich auch nichts anfangen, sorry.



  • zum \n:
    ich habe das gemacht, aber ändert nix. ich bin mir nicht sicher, ob ich das so gemacht habe, wie du meintest. in welchen zeilen hast du das denn gemeint.

    ich habe keine umlaute eingegeben, oder im text, daran kann es also nicht liegen.

    den tipp mit der länge eines zeichens werde ich anwenden, danke für den tipp



  • sarah1986 schrieb:

    zum \n:
    ich habe das gemacht, aber ändert nix. ich bin mir nicht sicher, ob ich das so gemacht habe, wie du meintest. in welchen zeilen hast du das denn gemeint.

    while(getchar()!='\n');
      cout << "Name:\t\t\t";        // Eingabe der gefragten Namen
      getline (cin, Mitglied[Zaehler].Name);
      //cin >> Mitglied[Zaehler].Name;    // Name als char-Array
    
      //...blub blub blub
    
      while(getchar()!='\n');
      cout << "\nOrt:\t\t\t";
      getline (cin, Mitglied[Zaehler].Ort);
      //cin >> Mitglied[Zaehler].Ort;        // Ort als string
    

    Sollte so gehen.



  • seit der änderung hab ich beim aufruf der funktion "neuer user" den
    run-time check failure #3
    und ich kann mir nicht erklären warum...



  • sarah1986 schrieb:

    und ich kann mir nicht erklären warum...

    Wie die Meldung (die du leider nicht gepostet hast) schon sagt, benutzt du eine uninitialiserte Variable. Die Entwicklungsumgebung sollte dir auch sagen, wo das passiert und um welche Variable es sich handelt.



  • es ging die ganze zeit, ich habe die variable deklariert. es ist alles in ordnung. kann dir gerne mal meinen kompletten code schicken, wenn du willst.


Anmelden zum Antworten