Supportnet / Forum / Anwendungen(Java,C++...)
c++ unformatierte eingabe, simples problem???
Frage
hi friends,
folgendes problem: dieser quelltext funzt angeblich (lehrer).
leider tut er es in der realität nicht.
meiner bescheidenen logik zufolge kann ich keinen fehler finden.
dies ist nur ein kleines testprogramm um den fehler zu finden.
die abfrage/eingabe des namens usw. funzt nicht wie es soll. ich hoffe es kann mir jemand helfen. ich bin noch neu in dieser materie und dieses problem bringt alles zum stillstand.
#include <iostream.h>
#include <conio.h>
int main()
{ clrscr();
char name[31], vorname[31], wohnort[31];
cout<<"name: ";
cin.sync();
cin.get(name, 30);
cout<<"vorname: ";
cin.sync();
cin.get(vorname, 30);
cout<<"wohnort: ";
cin.sync();
cin.get(wohnort, 30);
cout<<endl<<name<<endl<<vorname<<endl<<wohnort;
return(0);
}
mfg & thanx
fruitloop
Antwort 1 von semi
Lass mal das hier laufen
Gruß,
Michael
#include <iostream.h>
/**
* Zeile bis zur gegebenen Laenge einlesen.
* Es werden max. (buflen-1) Zeichen gelesen.
*
* @param in Inputstream
* @param buf Zeilenpuffer
* @param buflen Laenge des Puffers
*/
void getline(istream& in, char *buf, int buflen)
{
char c;
while(--buflen>0 && ((c=in.get())!='\n'))
*(buf++) = c;
*(buf) = (char)0;
while(c!='\n') c=in.get();
}
int main() {
char name[10], vorname[10], wohnort[10];
cout<<"name: ";
getline(cin, (char*)&name, 10);
cout << "vorname: ";
getline(cin, (char*)&vorname, 10);
cout<<"wohnort: ";
getline(cin, (char*)&wohnort, 10);
cout<<endl<<name<<endl<<vorname<<endl<<wohnort;
return(0);
}Gruß,
Michael
Antwort 2 von Casvil
mach es doch viel einfacher:
Sollte funzen, warum du mit cin.sync() oder cin.get() arbeitest versteh ich nicht. du willst nur die daten eingeben und wieder ausgeben oder?
du brauchst dann auch nur iostream.h zu includen. wenn du dann in der variable einen neuen wert speichern willst, kannst du sie normal mit (cin>>)nutzen.
Cas
ps. ich hoffe ich hab dich nicht missverstanden.
...
cout<<"Name: ";
cin>>name;
cout<<"Vorname ";
cin>>vorname;
cout<<"Wohnort: ";
cin>>wohnort;
cout<<endl<<vorname<<name<<wohnort;Sollte funzen, warum du mit cin.sync() oder cin.get() arbeitest versteh ich nicht. du willst nur die daten eingeben und wieder ausgeben oder?
du brauchst dann auch nur iostream.h zu includen. wenn du dann in der variable einen neuen wert speichern willst, kannst du sie normal mit (cin>>)nutzen.
Cas
ps. ich hoffe ich hab dich nicht missverstanden.
Antwort 3 von Casvil
Nachtrag der Quelltext den du benutzt hat einen Fehler:
Am Anfang nutzt du die Funktion" clrscr()"
Änderungen sind fett.Wenn es doch nicht das Problem/Lösung war, dann schreib einfach nochmal.
Cas
Am Anfang nutzt du die Funktion" clrscr()"
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
system("cls"); //Ich gehe davon aus, dass du den Bildschirm
//in der Konsole leeren willst
char name[31], vorname[31], wohnort[31];
cout<<"name: ";
cin.sync();
cin.get(name, 30);
cout<<"vorname: ";
cin.sync();
cin.get(vorname, 30);
cout<<"wohnort: ";
cin.sync();
cin.get(wohnort, 30);
cout<<endl<<name<<endl<<vorname<<endl<<wohnort;
return(0);
}
Änderungen sind fett.Wenn es doch nicht das Problem/Lösung war, dann schreib einfach nochmal.
Cas
Antwort 4 von Casvil
Also der Quellcode mit meiner ersten Antwort zusammen würde dann so aussehen:
Cas
#include <iostream.h>
#include <stdlib.h>
int main()
{
system("cls");
char name[31], vorname[31], wohnort[31];
cout<<"name: ";
cin>>name;
cout<<"vorname: ";
cin>>vorname;
cout<<"wohnort: ";
cin>>wohnort;
cout<<endl<<name<<endl<<vorname<<endl<<wohnort;
return(0);
}
Cas
Antwort 5 von Fruitloop
hi,
danke für eure vorschläge,
die passen auch alle,
@ casvil: ich weiss das es auch einfacher geht.
dies ist nur ein beispiel ohne weitere bedeutung. es geht nur um die funktion cin.get().
ich habe die 3 char-strings. die erste eingabe (name) geht ja noch. wenn ich dann mit enter bestätige "überspringt" das programm die nächsten eingaben einfach, er zeigt nur in einer zeile an:
"vorname:wohnort:" und macht dann direkt die ausgabe. ich habe gar keine chance die 2. und 3. eingabe zu machen. wenn jedoch z.b. nach der wohnorteingabe ein array eines anderen datentyps (z.b. int) kommt dann macht er damit weiter. sind es aber mehrere int-arrays hintereinander kommt wieder der gleiche fehler. es funzt immer nur das erste cin.get().
die konsolenausgabe sieht so aus:
mfg
fruitloop
danke für eure vorschläge,
die passen auch alle,
@ casvil: ich weiss das es auch einfacher geht.
dies ist nur ein beispiel ohne weitere bedeutung. es geht nur um die funktion cin.get().
ich habe die 3 char-strings. die erste eingabe (name) geht ja noch. wenn ich dann mit enter bestätige "überspringt" das programm die nächsten eingaben einfach, er zeigt nur in einer zeile an:
"vorname:wohnort:" und macht dann direkt die ausgabe. ich habe gar keine chance die 2. und 3. eingabe zu machen. wenn jedoch z.b. nach der wohnorteingabe ein array eines anderen datentyps (z.b. int) kommt dann macht er damit weiter. sind es aber mehrere int-arrays hintereinander kommt wieder der gleiche fehler. es funzt immer nur das erste cin.get().
die konsolenausgabe sieht so aus:
name: fruitloop
vorname: wohnort:
fruitloop
mfg
fruitloop
Antwort 6 von Casvil
das Problem ist folgendes, du hast wahrscheinlich noch den '/n'(enter) im Tastaturpuffer. schreib einfach hinter jedes cin>>...;
cin.ignore();
Aber komisch ist das schon, aus Antwort 4 der Quelltext funzt bei mir so wie du es willst.
Cas
cin.ignore();
Aber komisch ist das schon, aus Antwort 4 der Quelltext funzt bei mir so wie du es willst.
Cas
Antwort 7 von semi
Das ganze funktioniert nur, wenn die eingegebene Zeichenkette nicht länger ist als das Array.
Antwort 8 von Casvil
Also einfach das Array vergrössern.
Cas
Cas
Antwort 9 von semi
Man könnte das Array unendlich lang machen. Ich gebe unendlich + 1 Zeichen ein und schon ist es gelaufen :-)
cin.get(name, 30) löscht die Eingabe leider nicht, wenn die Länge überschritten wird.
cin >> name; schreibt wieder ins Nirvana, wenn die Eingabe zu lang ist.
cin.get(name, 30) löscht die Eingabe leider nicht, wenn die Länge überschritten wird.
cin >> name; schreibt wieder ins Nirvana, wenn die Eingabe zu lang ist.
Antwort 10 von Casvil
@semi das ist ein toller satz mit dem unendlich. mann kann aber ein array mit 100 zeichen anlegen und durch fehlerkontrolle einen overrun verhindern. soviel dazu. aber für den anfang als anfänger, reicht es wenn man ein array so gross macht, dass eine eingabe(vorraussichtlich) niemals den array überschreiten wird.(zum beispiel bei dem vornamen nur 30 zeichen)
aber der quelltext aus meiner antwort(antwort4) funzt auf jeden fall. ich hab es selbst ausprobiert. oder wenn du nicht willst fruitloop, dann nimm den quellcode aus antwort 3 der funzt auch.
cas
aber der quelltext aus meiner antwort(antwort4) funzt auf jeden fall. ich hab es selbst ausprobiert. oder wenn du nicht willst fruitloop, dann nimm den quellcode aus antwort 3 der funzt auch.
cas
Antwort 11 von Fruitloop
hi
thanx to casvil:
mit dem cin.ignore(); funzt es jetzt.
mich würde nur noch interessieren warum bei so ziemlich allen ausser mir der quelltext ohne cin.ignore(); funzt.
warum wird der \n nicht mit cin.sync(); gelöscht??
ich benutze im moment noch den freeware comandline-compiler von borland mit einem passenden editor(ConTEXT).
mfg
fruitloop
thanx to casvil:
mit dem cin.ignore(); funzt es jetzt.
mich würde nur noch interessieren warum bei so ziemlich allen ausser mir der quelltext ohne cin.ignore(); funzt.
warum wird der \n nicht mit cin.sync(); gelöscht??
ich benutze im moment noch den freeware comandline-compiler von borland mit einem passenden editor(ConTEXT).
mfg
fruitloop
Antwort 12 von Casvil
Ich nutze Visual C++ von unserem lieblings Monopolisten=).Die Funktion cin.sync() hab ich noch nie benötigt, kann dir daher wenig darüber sagen.
Warum es klappt weiss ich nicht, aber es kann sein, dass du ein Leerzeichen schreibst(z.B."Albert [/n]")Soweit ich weiss, Ignoriert cin>>...; nach einem Leerzeichen die Eingabe. Was bedeutet, das das [/n] noch im Tastaturpuffer liegt. Ich müsste das aber selbst erstmal nachschauen.
Cas
Warum es klappt weiss ich nicht, aber es kann sein, dass du ein Leerzeichen schreibst(z.B."Albert [/n]")Soweit ich weiss, Ignoriert cin>>...; nach einem Leerzeichen die Eingabe. Was bedeutet, das das [/n] noch im Tastaturpuffer liegt. Ich müsste das aber selbst erstmal nachschauen.
Cas
Antwort 13 von Fruitloop
thanx @ all,
ich denke dass es an den unterschiedliche entwicklerumgebungen/compilern liegt.
für mich ist das problem jetzt gelöst!
thanx & mfg
fruitloop
ich denke dass es an den unterschiedliche entwicklerumgebungen/compilern liegt.
für mich ist das problem jetzt gelöst!
thanx & mfg
fruitloop

