Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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 ???

Geschrieben

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

Geschrieben

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.

Geschrieben

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.

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben
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 ???

Geschrieben

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

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...