C++ Von der Kosole einlesen belibig viele Zeichen

macwraith

Newbie
Registriert
Juni 2009
Beiträge
3
Hallo,
habe mal eine Frage und zwar.
Ich muss von der Konsole einlesen, gefordert ist, dass es beliebig lange Zeichenketten sein sollen.
Alles wird in char[] gespeichert (keine strings).

Aktuell sieht meine Funktion so aus:

Code:
int maxLaenge = 100;
char Type[maxLaenge+1];


void Flugzeug::einlesen(istream& InputStream = cin, int  mitEingabeaufforderung){
     char* einlesen = new char[maxLaenge+1]; 
     cout << "Bitte Type eingeben: ";
     if(InputStream >> setw(maxLaenge) >> einlesen){
       strncpy(Type,einlesen,maxLaenge-1);
       Type[maxLaenge-1]= '\0';
       InputStream.ignore(INT_MAX,'\n');
     }
     else{
         cerr << "Es ist leider ein Fehler aufgetreten." << endl;
     }
}
Kann somit nur 100 Zeichen lesen.
Irgendwie muss das Array Type dynamische angelegt werden.
Wie aber kann ich die Länge bzw. Anzahl der Zeichen bestimmen???
 
Zuletzt bearbeitet von einem Moderator: (Bitte künftig die Code-Tags verwenden. ;))
Muss es unbedingt ein char-Array sein oder darf es
auch ein Stringcontainer sein ?

#include <string> ist dein freund.

oder du holst dir einen Zeiger auf char und reservierst speicher zur
Laufzeit, char *pchar=0 und holst dir mit new soviel speicher wie du
eben brauchst; pchar= new char[int]. Aufraümen mit delete nicht vergessen.

Grüße

S
 
leider muss es ein char array sein.
unser prof hat ausdrücklich string verboten.

dass ich den speicher für das array zur laufzeit holen (dynamisch) muss,
ist klar.
mein problem liegt eben darin, wie bekomme ich heraus wie viele zeichen
eingegeben wurden.........
 
Hmm, habe ich doch glatt alles überlesen, sorry.
Kann es sein, dass euer Prof möchte, das ihr eine verkettete
Liste entwerft (also im Grund einen eigenen String container)?
Genau dafür sind container-klassen da, um Datenstrukturen genau
so groß zu halten wie gerade benötigt.

Ansonsten fiele mir nur noch ein, eine Zählvariable mitzählen zu
lassen, und bei Bedarf in einen größeres array rüberzukopieren,
ggf. jedes mal in ein um eine Stelle vergrößertes, damit
gewinnst du aber sicher keinen preis. Vor allem kopierst du
pro Zeichen das eingegeben wird das gesamte Array in ein anderes,
nichts frisst mehr Performance als Kopieraktionen.

Wie Du sonst die Länge dea Arrays hellsehen sollst ist mir ein Rätsel.

Könnte es sein, das du einfach zu Beginn des Programms
nach der array-größe fragen sollst ?

*duckundwech*
 
Zuletzt bearbeitet:
hi,
eine ist verkettete Liste entwerft ist es nicht,
damit worden wir bereits "gequält".
 
Also bei Streams gibts auf jeden Fall die Methode eof() die dir anzeigt, ob das Ende des Streams erreicht ist. Nun kannst du solange ein Zeichen einlesen, bis das Ende des Streams erreicht ist.

Also entweder
Die Zeichen einlesen, und in einem Puffer speichern. Wenn der Puffer voll ist, größeren Puffer allokieren, und die Zeichen aus dem alten Puffer übernehmen

oder
Alle Zeichen einlesen, nicht speichern, sondern nur einen Zähler erhöhen. Puffer mit dem Zählerstand allokieren, Stream zurücksetzen, wieder alle Zeichen einlesen und im Puffer speichern.

\edit
oder
wenn ihr schon Datenstrukturen habt die sich dynamisch ändern, kannst du auch die hernehmen.
 
Zuletzt bearbeitet:
macwraith schrieb:
Kann somit nur 100 Zeichen lesen.
Irgendwie muss das Array Type dynamische angelegt werden.

Natürlich kannst du den Speicher dynamisch allokieren, was dann auf den Heap angelegt wird.

macwraith schrieb:
mein problem liegt eben darin, wie bekomme ich heraus wie viele zeichen
eingegeben wurden.........

Gar nicht! Wie soll das gehen? Der Computer ist kein Hellseher. Du musst beim Einlesen ausreichend Platz auf dem Speicher schaffen.

Falls mehr Platz benötigt wird, muss du manuell den Speicher in ein größeren allokierten Speicherbereich kopieren, z.B. mit memcpy.

Das macht die Klasse std::string übrigens automatisch.
 
Zurück
Oben