🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #713

Re: Schlechte Eingabemethode?

#713
From: Bernd Eggink
Date: Thu, 02 Nov 1995 16:54
70 lines
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!admin
References: <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]