Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

cin.getline

Empfohlene Antworten

Veröffentlicht

moin!

also erstma! mache noch nich solange C/C++.

Zu meiner Frage. Ich will Sätze mit cin.getline einlesen. Irgendwelche Daten wie : Peter Müller oder so. Halt mit Leerzeichen.

Mit cin >> geht das ja nicht.

So weit so gut. Das funzt ja auch alles, bloss habe ich in jetzt noch n switch drin.

um die einzelnen fälle vom switch aufzurufen, muss ich dafür ja ne zahl einlesen.

Aber irgendwie verträgt sich cin >> mit cin.getline net. Wenn ich beides im selben Proggi nutze.

Was kann ich sonst noch nutzen, um zahlen einzulesen ???

Versuch es einfach mal so, das Du eine Zeile unter der in der Du mit cin >> etwas einliest folgendes zu schreiben.

cout << endl;

Dann müßte es funktionieren. Ich denke Dein Problem ist nämlich nur das der Puffer nicht geleert ist.

Schreib mal ob es geklappt hat.

Sabine

Poste doch mal nen Auszug von deinem Quellcode.

Aber sicher geht das mit cin!

void main(void) {

char* satz;

cout << "Bitte Satz eingeben: ";

cin >> satz;

cout << "\nSie haben eingegeben:\n\n" << satz;

} //main

Wenn man nur "char satz;" schreibt geht das nicht weil "char" ja nur ein Buchstabe ist. Aber ein Zeiger auf Buchstaben (char*) entspricht einem String.

Ich denke auch das Du mal ein bisschen Quelltext posten solltest. Sonst können wir Dir nicht wirklich helfen....

Bine

soll ich den ganzen Quelltext hier posten ?

Ja, mach ruhig mal. Dann kann man Dein Problem besser verstehen und erkennen woran es liegen könnte.

Bine

dann poste ich mal den quellcode:

#include <iostream>

#include <iomanip>

#include <conio>

#include <stdio>

#include <string>

using namespace std;

struct Adresse

{

char name[50];

char strasse[25];

char ort[25];

char telefon[15];

};

char * pch;

struct Adresse adressdaten[7];

int eingabeMenu = 0;

//*************** Prototypen *********************

void ausgabe();

void eingabe();

//*************** Hauptfunktion *********************

int main()

{

do

{

cout << "1)Adressdaten eingeben\n";

cout << "2)Adressdaten anzeigen\n";

cout << "3)Programmende\n";

cin >> eingabeMenu;

cout << endl;

switch(eingabeMenu)

{

case 1:

{

eingabe();

break;

}

case 2:

{

ausgabe();

break;

}

case 3:

{

break;

}

default:

{

cout << "\n\nSie muessen einen Wert zwischen 1 und 3 eingeben!";

break;

}

}

}

while(eingabeMenu !=3);

return 0;

}

//**************** Eingabe ****************

void eingabe()

{

cout << "\nJetzt werden die Daten eingelesen / Bitte keine Leerzeichen eingeben!";

cout << "\nGeben Sie den Strassennamen ein: ";

cin >> adressdaten[0].strasse;

cout << "\nGeben sie ihren Namen ein: ";

cin >> adressdaten[0].name;

pch = strtok (adressdaten[0].name, " ");

cout << "\nGeben Sie ihren Wohnort ein: ";

cin >> adressdaten[0].ort;

cout << "\nGeben Sie ihre Telefonnummer ein: ";

cin >> adressdaten[0].telefon;

}

//*************** Ausgabe ******************

void ausgabe()

{

cout << adressdaten[0].strasse << endl;

while (pch != NULL)

{

cout << "\n" << pch;

pch = strtok (NULL, " ,.");

}

// cout << adressdaten[0].name << endl;

cout << adressdaten[0].ort << endl;

cout << adressdaten[0].telefon << endl;

}

so is nich wirklich übersichtlich, aber ich hoffe das ihr mir trotzdem helfen könnt.

Die Lösung ist gar nicht so schwer. Du musst nur in dem Bereich wo Du dann einließt das '\n' ignorieren.

Also so:

#include <iostream.h> 
#include <iomanip.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>



struct Adresse
{
char name[50];
char strasse[25];
char ort[25];
char telefon[15];
};

struct Adresse adressdaten[7];
int eingabeMenu = 0;


//*************** Prototypen *********************

void ausgabe();
void eingabe();

//*************** Hauptfunktion *********************
int main()
{
do
{

cout << "1)Adressdaten eingeben\n";
cout << "2)Adressdaten anzeigen\n";
cout << "3)Programmende\n";
cin >> eingabeMenu;
cout << endl;

switch(eingabeMenu)
{
case 1:
{
eingabe();
break;
}
case 2:
{
ausgabe();
break;
}
case 3:
{

break;
}
default:
{
cout << "\n\nSie muessen einen Wert zwischen 1 und 3 eingeben!" << endl;
break;
}
}
}

while(eingabeMenu !=3);
return 0;
}

//**************** Eingabe ****************
void eingabe()
{
cin.ignore(1, '\n');
cout << "\nJetzt werden die Daten eingelesen!";
cout << "Geben Sie den Strassennamen ein: ";
cin.getline(adressdaten[0].strasse, 25);
cout << "Geben sie ihren Namen ein: ";
cin.getline(adressdaten[0].name, 50);
cout << "Geben Sie ihren Wohnort ein: ";
cin.getline(adressdaten[0].ort, 25);
cout << "Geben Sie ihre Telefonnummer ein: ";
cin.getline(adressdaten[0].telefon, 15);
cout << "\n\n";
}

//*************** Ausgabe ******************
void ausgabe()
{
cout << adressdaten[0].name << endl;
cout << adressdaten[0].strasse << endl;
cout << adressdaten[0].ort << endl;
cout << adressdaten[0].telefon << endl;
cout << "\n\n";
}[/PHP]

Bine

um zahlen einzulesen kannst du noch scanf() benutzen.

du kannst cin und cin.getline aber auch gemeinsam nutzen. du mußt nur nach jeder benutzung den inputpuffer leeren (stdin). also nach jedem cin bzw cin.getline() den befehl

fflush(stdin);

dann ist der eingabe puffer wieder jungfräulich.

mit scanf hast du aber auch vielfältige möglichkeiten in mehrere variablen gleichzeitig einzulesen. guck am besten mal in deiner literatur dazu nach.

übrigend, cin.getline liest in ein char array nicht in eine Variable vom Typen String.

wie meinst das!

is das jetzt auf mein Beispiel bezogen oder meintest du das jetzt allgemein?

allgemein. weil cin ja in String einlesen kann. das kann cin.getline nicht. da brauchste n char string[200] oder so.

Hallo zusammen!

Ich wollte schnell ein paar allgemeine Bemerkungen loswerden:

void main (void) entspricht nicht dem ANSI/ISO C++-Standard. Es wird von vielen Compilern akzeptiert, ist aber nicht richtig und sollte nie benutzt werden, da so kein Rückgabewert ans Betriebssystem geliefert wird.

cout << endl; ist um den Puffer zu leeren aus mehreren Gründen nicht nötig:

1) cout << endl; ist ein zusammengesetztes cout << '\n'; cout.flush(); Wenn es also nur darum geht den Puffer zu leeren, dann reicht ein cout.flush().

2) Auch ein cout.flush() ist nicht nötig weil man cout und cin mit tie() aneinander binden kann, so daß zum Beispiel die Ausgabe auf dem Bildschirm erscheint bevor die Eingabe erwartet wird.

3) Auch tie() ist nicht nötig, da der Standard besagt, daß die beiden Streams (cin, cout) syncronisiert sind, also die Ausgabe vor der Eingabe ausgeführt wird.

using namespace std sollte man besser in die einzelnen Funktionen hereinziehen, oder wenn es kleine Funktionen sind, die nicht soviele cin, cout, etc aus dem Standard Namespace haben mit std:: arbeiten. So wird verhindert, daß man Namensüberschneidungen hat. Dies kann unter umständen zu sehr komischen Fehlermeldungen führen.

Und ganz wichtig: char *string; ist bei weitem kein String!!!! Es ist ein Zeiger auf einen Datentyp char. char *satz ="Hallo Welt!"; funktioniert nur, weil der Compiler zur Übersetzungszeit sieht, Hallo Welt hat soundso viel Buchstaben, also brauche ich soundsoviel Speicher. ich kann jetzt sicherlich nicht satz erweitern. Wenn man char *satz; hat, dann muß man, wenn man sich in C befindet mit malloc speicher reservieren, oder in C++ new benutzen. malloc funktioniert zwar auch in C++ doch sollte man hier wirklich auf new zurückgreifen.

Jan

Original geschrieben von Orffi

Es ist ein Zeiger auf einen Datentyp char. char *satz ="Hallo Welt!"; funktioniert nur, weil der Compiler zur Übersetzungszeit sieht, Hallo Welt hat soundso viel Buchstaben, also brauche ich soundsoviel Speicher. ich kann jetzt sicherlich nicht satz erweitern.

Aber eben das ist doch gute dynamische Speicherverwaltung, oder ???

Es kommt darauf an, was man als gut empfindet. Das entscheidene hier ist: "zur Übersetzungszeit". Hier ist überhaupt nichts Dynamisches. Dynamisch bedeutet, daß irgendetwas zur Laufzeit passiert. Im allgemeinen hat man unter C++ Strings die man benutzen sollte, da hier die ganze Speicherverwaltung von string geregelt wird.

Worauf ich hinaus wollte war: char *satz; ist definitiv kein Speicherplatz für einen String. Bei "char *satz;" reserviert der Compiler Speicherplatz für einen Zeiger, der auf char zeigt. Mehr nicht und das ist meilenweit davon entfernt ein string zu sein.

HTH

Jan

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.