Noch ne c++ frage

Wenn man einen Pointer char* einstring[82]deklariert, kann man ihm dann sofort daten zuweisen, oder muss man ihm erst platz im speicher reservieren?
wenn man dann die funktion getc(einstring)benutzt, wird doch automatisch speicher reserviert, oder?
wenn ja, wird 82 Byte reserviert oder nur soviel, wieviel der eingegebene string
wirklich benoetigt?

Wenn man einen Pointer char*
einstring[82]deklariert, kann man ihm
dann sofort daten zuweisen, oder muss man
ihm erst platz im speicher reservieren?

Du willst eine Zeichenkette mit 82 Zeichen haben? Dann schreibst du:
char einstring[83];
Bedenke, daß in C (und dieses verwendest Du hier!) die Zeichenketten durch ein \0 terminiert sind.
Du hast im obigen Beispiel ein Array (von 0 bis 81) von Pointer auf char definiert.
Wenn Du eine dynamische Zeichenkette haben willst, dann solltest Du folgendes verwenden:
–Schnipp---------------------
char *pEinString;
pEinString = new char[83];

cout

Wenn man einen Pointer char*
einstring[82]deklariert, kann man ihm
dann sofort daten zuweisen, oder muss man
ihm erst platz im speicher reservieren?

Du kannst zuweisen - jedoch max. 82 Zeichen. Bedenke, daß Strings in C mit \0 terminiert werden. Diese 0 mußt Du mit einberechnen

wenn man dann die funktion
getc(einstring)benutzt, wird doch
automatisch speicher reserviert, oder?

Nein, Du benötigst einen Buffer, der groß genug ist.

wenn ja, wird 82 Byte reserviert oder nur
soviel, wieviel der eingegebene string
wirklich benoetigt?

Bei Deinem Beispiel werden immer 82 Bytes reserviert.

char* einstring[82]

Anleitung zum Lesen von C/C++ Deklarationen (Ausschnitt):

  1. Suche den Identifier, lies ihn: „einstring“
  2. Gucke nach rechts, ob da eine eckige Klammer ist, wenn ja lies „ein Array von“ und die Zahl in den Klammern „82“
  3. Wieder hole 2. bis keine eckigen Klammern mehr da sind. (im Beispiel sofort der Fall)
  4. Gucke nach links, ob da ein Stern ist, wenn ja lies „Pointer auf“
  5. Wiederhole 5. solange bis keine Sterne mehr da sind (im Beispiel sofort der Fall)
  6. Gucke nach links, ob da ein Typ steht, lies ihn: „char“.

Also:

‚einstring‘ ist ein Array von 82 Pointer(n) auf ‚char‘.

Überrascht?

deklariert, kann man ihm
dann sofort daten zuweisen, oder muss man
ihm erst platz im speicher reservieren?

Das Array der Pointer ist da, du wolltest aber sicher:

char einstring[82];

Oder wie bei dir, dann aber noch Speicher für die Strings allokieren:

for ( int n = 0; n

Moin moin,

  1. die Deklaration in der Form

char* :einstring[82] funktioniert nicht.

Wenn schon, dann

char einstring[82];
Es werden jetzt schon 82 Byte reserviert.

Ein anderer Fall liegt vor, wenn man
AnsiString einstriing

deklariert. Hier werden nur die Bytes reserviert, die wirklich gebraucht werden…

cu. Frank.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Frank!

Ein anderer Fall liegt vor, wenn man
AnsiString einstriing

deklariert. Hier werden nur die Bytes
reserviert, die wirklich gebraucht
werden…

Welcher Compiler hat solch einen Variablen-Typ?!? Mir ist in meinem ganzen Programmiererleben noch kein „AnsiString“ vorgekommen. Es scheint sich daher (trotz des Namens) nicht um einen ANSI-Standard zu handeln…

Ciao,
Pürsti

Danke…
für die Antworten!
also wenn ich das jetzt richtig seh, kann man entweder einen String mit fester grösse erstellen - mit char einstr[zahl] - oder einen pointer mit char* einstr, dem man dann dynamisch platz zuweisen/wegnehmen kann, oder?

Moin moin Josef,

da gibt´s ein Teil namens Borland C++ Builder, bei Microsaft heisst der Datentyp
eventuell einfach „String“.

cu. Frank.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Frank!

Danke für die Aufklärung. Da ich weder Borland noch Microsoft benutze (sondern GNU) entgehen einem solche Datentypen. Aber man lernt eben nie aus.

Cu, Pürsti

da gibt´s ein Teil namens Borland C++
Builder, bei Microsaft heisst der
Datentyp
eventuell einfach „String“.

cu. Frank.