Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Anfängerfrage zu cin

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.10.2006, 13:14 Uhr
~Dreamworld
Gast


Hi, ich bin sehr neu in cpp
Hab ein kleines Programm gebastelt, das einfach nur einen Text einliest...aber seht selbst:

C++:
#include <iostream.h>

main()
{
      int zahl;
      
      cin >> zahl;

      char ctext[255];

      cout << "Text eingeben! " << endl;
      cin.getline(ctext, 255, '\n');
      cout << "Eingegebener Text: " <<endl << ctext;

};


wenn ich das cin >> zahl weglasse, dann liest cin.getline ohne Probleme meine Zeile ein, mit cin >> zahl, wird das Programm nach Eingabe von der Zahl beendet. Warum ist das so? Wie kann ich das ändern?
Wahrscheinlich isses irgendwas simples, aber ich komm nicht drauf.

Danke sehr.


Bearbeitung von 0xdeadbeef:

cpp-tags eingefügt, nächstes mal selbst machen.


Dieser Post wurde am 19.10.2006 um 13:22 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.10.2006, 13:37 Uhr
0xdeadbeef
Gott
(Operator)


Heh. Da bist du auf ne ziemlich alte Geschichte reingefallen. Also gut, der Reihe nach, erstmal die Unfeinheiten:

C++:
#include <iostream>

using namespace std;


#include <iostream.h> ist schlicht und ergreifend falsch. Es gab vor der Standardisierung von C++ eine Zeit, in der viele Compiler das so gemacht haben, nichtsdestoweniger ist es inzwischen einfach falsch, und neuere Compiler lehnen das in aller Regel auch ab. Oben ist der Standard-Weg, das zu ersetzen, wobei using namespace std; dazu da ist, Objekte im namespace std ohne Präfix benutzen zu können - ohne es müsstest du später

C++:
std::cin >> zahl;


schreiben.


C++:
int main()


main ist immer int. Und in C++, wie auch in C99, musst du das explizit angeben.

Was das eigentliche Problem angeht, was passiert ist folgendes: Angenommen, du willst ihm 23 als Zahl und "Hallo" als string mitgeben. Wenn du das auf der Konsole eingibst, steht im Eingabestream

C++:
"23\nHallo\n"


drin. Was passiert, ist also folgendes:

C++:
cin >> zahl;


liest die 23 aus dem Stream. Danach steht im Stream noch

C++:
"\nHallo\n"


drin.

C++:
cin.getline(text, 255, '\n');


Liest bis zum nächsten \n aus dem Stream, danach steht also im Stream noch

C++:
"Hallo\n"


...und in text steht "".

Der einfachste Weg darum herum für den Moment dürfte wohl sein, getline zweimail aufzurufen, aber das ist natürlich nicht der schönste Weg. Sinnvoll ist an dieser Stelle, die Eingabe zu buffern, das bedeutet

C++:
#include <iostream>
#include <sstream>
#include <string> // für einfacheres string-handling

using namespace std;

int main() {
  int zahl;
  string buf, text;
  istringstream isstr;

  getline(cin, buf);
  isstr.str(buf);
  isstr >> zahl;

  getline(cin, text);

  cout << text << " -- " << zahl << endl;
}


Auf die Art liest du jeweils eine Zeile ein, baust daraus einen Eingabestream isstr und parst daraus die Zahl, dementsprechend bleiben die Überreste nicht in cin, sondern in isstr hängen, und werden da einfach vergessen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 19.10.2006 um 13:41 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.10.2006, 14:05 Uhr
Dreamworld



Ui das is eine Menge Holz auf einmal...
naja ich les einfach mal mein Büchlein weiter, vielleicht ergibt das später für mich mehr Sinn.
Danke aber für die Antwort.

Übrigens, hab mich registriert
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.10.2006, 15:38 Uhr
Dreamworld



Ja moment.
Ich rufe ja eigentlich cin auf, dann wartet das Programm auf die erste eingabe.
Diese Eingabe wird in die Variable Zahl geschrieben.
Erst danach beginnt der String mit dem Text.
Das sind doch 2 unterschiedliche Variablen, also wieso sollte das in einem Stream abgespeichert werden?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.10.2006, 15:47 Uhr
0xdeadbeef
Gott
(Operator)


Weil cin halt ein Eingabestream ist. Den rufst du auch nicht auf, der ist nämlich keine Funktion. Was du da aufrufst ist istream &operator>>(istream&, int).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.10.2006, 17:04 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Jetzt hast du Ihn ganz verwirrt
Du rufst nur ">>" auf, und cin ist einer der Standardstreams von C++, der in iostream definiert ist.

C++:
cin = C Input
cout = C Output
cerr = C Error

Damit kannst du einfach arbeiten. Intern sichert C++ dann alles so, das du mit cin auf das zugreifen kannst, was jemand eingegeben hat. mit cout kannst du ausgeben und mit cerr auf STDERR schreiben.

Wenn du in einen stream schreibst, kannst du besser etwas anhängen/ausgeben und evtl. in andere Datentypen konvertieren. Das konvertieren ist genau der Grund hier. Du holst etwas aus dem Stream und sicherst es in einer Variablen. Der Wert wird dann automatisch dem Datentyp der Zielvariable zugewiesen.
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.10.2006, 17:17 Uhr
0xdeadbeef
Gott
(Operator)



Code:
cin = console input
cout = console output
cerr = console error


...nur so am Rande
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: