noch ne c++ frage

Von: , Frage gestellt am Di, 12. Okt 1999

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?

8 Antworten zu dieser Frage

  1. Antwort von nach 11 Stunden hilfreich
    Re: 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?
    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 << pEinString << endl;
    ...
    delete[] pEinString;
    --Schnapp---------------------
    Merke: Wenn Du Pointer verwendest, so mußt Du immer Speicher für dafür mit new (oder unter C mit malloc) reservieren und diesen später immer durch delete wieder freigeben (C: free). new kann in den Konstruktor und delete in den Destruktor von Objekten. wenn man dann die funktion
    getc(einstring)benutzt, wird doch
    automatisch speicher reserviert, oder?
    Äh, da müßte ich jetzt in der Bibel (C++ von Bjarne Stroustrup (oder so ähnlich)) nachsehen. wenn ja, wird 82 Byte reserviert oder nur
    soviel, wieviel der eingegebene string
    wirklich benoetigt?
    Dann müßte die Funktion (Methode?) getc den Typ untersuchen. Dies ist aber meines Wissens in C++ nicht direkt vorgesehen (okay über RTTI wohl möglich).

    Außerdem liest meiner Meinung nach die Funktion getc nur ein char und keine Zeichenkette. Insofern dürfte folgendes ausreichen.
    --Schnipp---------------------
    char cTemp;
    ...
    getc(&cTemp);
    ...
    --Schnapp---------------------
    Da kann ich mich auch irren, da ich diese Funktion alle Himmeljahre mal brauch und dann immer wieder nachschauen muß.

    MfG
    Frank

  2. Antwort von nach 12 Stunden hilfreich
    Re: 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?
    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.

  3. Antwort von nach 13 Stunden hilfreich
    Re: noch ne c++ frage

    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 < 82; n++ )
    einstring[n] = new char[ ... ]; wenn man dann die funktion
    getc(einstring)benutzt, wird doch
    automatisch speicher reserviert, oder?
    Was soll das für eine Funktion sein? Ich kenne nur getc() ohne Parameter. Und die braucht keinen Speicher, ausser den char im Returnwert, der auf dem Stack transportiert wird. wenn ja, wird 82 Byte reserviert oder nur
    soviel, wieviel der eingegebene string
    wirklich benoetigt?
    Von den 82 Byte wird die Funktion auf keinen Fall etwas wissen.

    Viel Erfolg wünscht
    Michael

  4. Antwort von nach 15 Stunden hilfreich
    Re: noch ne c++ frage

    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]

    • Antwort von nach 21 Stunden hilfreich
      Re^2: noch ne c++ frage

      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

      • Antwort von nach einem Tag hilfreich
        Re^3: noch ne c++ frage

        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]

        • Antwort von nach einem Tag hilfreich
          Re^4: noch ne c++ frage

          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.

  5. Antwort von nach 22 Stunden hilfreich
    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?

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!