Article View: de.comp.lang.c++
Article #713Re: Schlechte Eingabemethode?
From: Bernd Eggink
Date: Thu, 02 Nov 1995 16:54
Date: Thu, 02 Nov 1995 16:54
70 lines
3127 bytes
3127 bytes
Kaspar Landsberg (kl@kl.in-berlin.de) wrote:
> Moin,
> beim Folgenden vermute ich, dass ich recht habe, bin mir jedoch nicht
> ganze sicher. Daher frage ich lieber mal nach... :-)
> // bsp.cc - kleines Beispielprogramm
> #include <iostream.h>
> int main(void)
> {
> cout << "\nName: ";
> char *eingabe = new char; // eingabe zeigt jetzt auf Speicherplatz
> // von *einem* (1 Zeichen) char-Objekt
> cin >> eingabe; // Benutzer gibt z.B. "Kaspar" ein (ohne " ")
> cout << "Ergebnis: " << eingabe << "\n";
> return 0;
> }
> So, der Knackpunkt liegt bei cout [...] << eingabe. Eigentlich wird nur
Nein, er liegt bei "cin >> eingabe". Schon wenn der Benutzer nur ein
Zeichen eingibt, werden 2 im Speicher abgelegt - das eingegebene und die
obligate '\0'. Du ueberschreibst also wild irgendwelche Speicherbereiche.
> die Adresse von eingabe ausgegeben, der auf ein char Objekt mit einem
> Zeichen zeigt. Da hier aber cout benutzt wird, wandelt es die Adresse
> automatisch in das Zeichen um, dessen Adresse von eingabe repraesentiert
Nein, ostreams wandeln nicht char* in Zeichen um, sondern geben alle
Zeichen ab der angegebenen Adresse aus, bis zur '\0'.
> wird. Nun geht macht aber cout solange weiter, bis auf auf das Nullzeichen
> trifft ('\0'). Das heisst also, dass das obige Programm "hinhaut". Denn es
> gibt (im obigen Falle) "Kaspar" und nicht nur "K" aus.
> Und nun zur eigentlichen Frage: Der Compiler hat eigentlich fuer eingabe
> nur Speicherplatz fuer ein Char-Objekt von *einem* Zeichen bereitgestellt.
> Daher wird doch, falls mehr als ein Zeichen eingegeben wird (z.b.
> "Kaspar") mehr Speicher benutzt, als eigentlich vom Compiler
> vorhergesehen, bzw. bereitgestellt, so dass eventuell schon besetzter
> Speicherplatz einfach durch die Eingabe von "Kaspar" bzw. von "aspar"
> ueberschrieben wird, oder??
Ja, s.o.
> Wenn ja, dann sollte man also derartige Methoden lieber ganz schnell
> vergessen, nehme ich kann...
Nein, man muss nur hinreichend viel Speicher zur Verfuegung stellen, z.B.
char eingabe[128]; // oder char *eingabe = new char[128];
//...
cin >> eingabe;
cout << "Ergebnis: " << eingabe << "\n";
> PS Fuer "char *eingabe = new char" haette man (IMO) auch einfach nur
> "char *eingabe" nehmen koennen.
Nein, das schon gar nicht (undefinierter Zeigerwert)!
Gruss
Bernd
--
+----------------------------------+
| Bernd Eggink |
| Rechenzentrum Uni Hamburg |
| admin@rzaix13.rrz.uni-hamburg.de |
+----------------------------------+
Technical Details
Message-ID:
<47at4e$aom@rzsun02.rrz.uni-hamburg.de>Path:
arc1-ca.pugleaf.net!news.rrz.uni-hamburg.de!rzaix13!adminReferences:
<5x0NrSGKhjB@kl.in-berlin.de>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.rrz.uni-hamburg.de!rzaix13!admin From: admin@rzaix13.uni-hamburg.de (Bernd Eggink) Newsgroups: de.comp.lang.c++ Subject: Re: Schlechte Eingabemethode? Date: 2 Nov 1995 16:54:38 GMT Organization: University of Hamburg -- Germany Message-ID: <47at4e$aom@rzsun02.rrz.uni-hamburg.de> References: <5x0NrSGKhjB@kl.in-berlin.de> NNTP-Posting-Host: rzaix13.rrz.uni-hamburg.de X-Newsreader: TIN [version 1.2 PL2]