String-Return

Dieses Thema im Forum "C/C++" wurde erstellt von gruenpflanze, 03.09.2007.

  1. #1 gruenpflanze, 03.09.2007
    gruenpflanze

    gruenpflanze Mitglied

    Dabei seit:
    25.06.2007
    Beiträge:
    26
    Zustimmungen:
    0
    Hallo!
    Ich habe wiedermal ein Problem mit C++ und Strings.
    Bei folgendem Programm soll in Zeile 24 ein String-Array zurückgegeben werden. Leider funktioniert das nicht, ich muss anscheinend mit Pointern arbeiten.
    Der string "eingabe" soll euch nicht verwirren, im richtigen Programm wird temp[...] aus dieser eingabe erstellt, vom Typ her aber genau gleich.

    Danke für eure Hilfe!
    Code:
    #include <iostream>
    #include <string.h>
    using namespace std;
    
    string text(string eingabe);
    
    int main()
    {
    string teile[100];
    string eingabe;
    
    getline (cin, eingabe);
    teile = text(eingabe);
    
    cout << ""<<teile[0]; //hier sollte "hallo" rauskommen
    }
    
    string text(string eingabe)
    {
    string temp[100];
    temp[0] = "hallo";
    temp[1] = "du";
    temp[2] = "mensch";
    return temp;   
    }
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 dietox, 04.09.2007
    Zuletzt bearbeitet: 04.09.2007
    dietox

    dietox Eroberer

    Dabei seit:
    26.05.2007
    Beiträge:
    74
    Zustimmungen:
    0
    Hmm, ich würde sagen, zwischen <string.h> (bzw. <cstring>) und <string> liegen Welten :)
    Ersteres ist die C-Library für String-Handling, zweiteres ist eine C++ Klasse, die String verwaltet (langsamer als die C-Methode, aber der ein oder andere bevorzugt sie trotzdem :P )

    Außerdem würde dir der Compiler bei größtem Warning-Level eine Warnung ausgeben, um
    dir mitzuteilen, dass 'eingabe' in der Funktion text() nicht verwendet wird.

    Tipp:
    Code:
    // statt 
    string text(string eingabe)
    // folgendes:
    string *text(string eingabe)
    
    Du willst ja immerhin einen String-Array zurückgeben ;)

    Hier ein Schnipsel Beispielcode:
    Code:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    string *text(string in)
    {
        string *tmp = new string[2];
        for(unsigned char i = 0; i < in.length(); i++)
        {
            if(in[i] == '\x20')
            {
                for(unsigned char j = 0; j < i; j++)
                    tmp[0] += in[j];
                for(unsigned char k = i+1; k < in.length(); k++)
                    tmp[1] += in[k];
            }
        }
        return tmp;
    }
    
    /*#################### main-function #####################*/
    int main()
    {
        string *arr = new string[2];
        string inp;
        cout << "Bitte Vor- und Zunamen angeben: ";
        getline(cin, inp);
        arr = text(inp);
    
        cout << "Vorname: " << arr[0] << endl << "Nachname: " << arr[1] << endl;
    
        delete[] arr;
        waitfe();
        return 0;
    }
    /*--------------------------------------------------------*/
     
  4. #3 Mµ*e^13.5_?¿, 04.09.2007
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    Zweimal new, einmal delete, das ist aber keine gute Bilanz ;)
     
  5. dietox

    dietox Eroberer

    Dabei seit:
    26.05.2007
    Beiträge:
    74
    Zustimmungen:
    0
    Hmm, dann gib doch mal einen bereits gelöschten Speicher zurück :)
     
  6. #5 Mµ*e^13.5_?¿, 04.09.2007
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    Ich verstehe nicht, was meinst du?
    Du erzeugst in der Main-Funktion zwei String-Objekte die nirgendwo benutzt und nirgendwo gelöscht werden.
     
  7. #6 chibacityblues, 04.09.2007
    chibacityblues

    chibacityblues Leisetreter

    Dabei seit:
    03.09.2007
    Beiträge:
    27
    Zustimmungen:
    0
    Ort:
    Hannover
    Er meint, dass es keinen Sinn machen würde in der oberen Funktion delete aufzurufen.

    Was du meinst, erschließt sich mir hingegen nicht ganz: In main() erzeugt er ein Array auf dem Heap (new[]) und gibt es später wieder frei (delete[]) -- der andere String inp stirbt beim "}".
     
  8. dietox

    dietox Eroberer

    Dabei seit:
    26.05.2007
    Beiträge:
    74
    Zustimmungen:
    0
    Exakt. :)
     
  9. #8 Mµ*e^13.5_?¿, 04.09.2007
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    Was freigegeben wird, ist das array, das von der Funktion zurückgegeben wird ("arr = text(inp);", "delete[] arr;"). Das Array, das in der Main-Funktion erzeugt wird, wird nicht freigegeben.

    Ps: Es ist natürlich klar, da das Programm sich gleich danach beendet ist es nicht sonderlich tragisch und die paar Bytes machen kaum etwas aus, aber generell sollte man eigentlich keinen Speicher verschenken.
     
  10. dietox

    dietox Eroberer

    Dabei seit:
    26.05.2007
    Beiträge:
    74
    Zustimmungen:
    0
    Nochmals: Der "normale" string inp kann gar nicht explizit freigegeben werden, es ist kein Zeiger.
     
  11. #10 Mµ*e^13.5_?¿, 04.09.2007
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    Ich hab doch davon auch gar nicht geredet, war das was ich gesagt habe so unverständlich? :think:
    Also nochmal ganz langsam.
    In Zeile 25 allozierst du Speicher für ein Array von 2 String-Objekten.
    In Zeile 29 überschreibst du den Pointer zu dem Array, damit ist der Speicher unerreichbar und damit futsch.
     
  12. #11 dietox, 04.09.2007
    Zuletzt bearbeitet: 04.09.2007
    dietox

    dietox Eroberer

    Dabei seit:
    26.05.2007
    Beiträge:
    74
    Zustimmungen:
    0
    Ich weiß nicht, was du hast; erstens funktioniert der obere Code prima und zweitens:
    Dem 2-Objekte großen String-Array (arr) wird der Rückgabewert der Funktion string text() zugewiesen, dies ist ebenfalls ein 2-Objekte großer String-Array.
     
  13. #12 Mµ*e^13.5_?¿, 04.09.2007
    Mµ*e^13.5_?¿

    Mµ*e^13.5_?¿ Routinier

    Dabei seit:
    21.02.2006
    Beiträge:
    453
    Zustimmungen:
    0
    Oder anders gesagt, ein Pointer wird ausgetauscht durch einen anderen, was passiert dabei mit dem Speicherbereich, auf den der Pointer vorher gezeigt hat? Genau .. Garnichts. Soll heißen, der Speicher bleibt belegt mit Nichts, bis zum Ende des Programms.
    Wenn du es nicht glaubst, dann schau es dir doch selbst an mit valgrind o.Ä.
    Richtig wäre es in Zeile 25 keinen Speicher zu allozieren. Also bloß "string *arr;" und nicht mehr.
     
  14. #13 Hello World, 23.09.2007
    Hello World

    Hello World Routinier

    Dabei seit:
    22.11.2006
    Beiträge:
    324
    Zustimmungen:
    0
    Autsch. Wieder einer, der nicht kapiert hat, war ein Pointer ist.
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. dietox

    dietox Eroberer

    Dabei seit:
    26.05.2007
    Beiträge:
    74
    Zustimmungen:
    0
    Natürlich musst du den Thread wieder rausholen und deinem Hobby, doofe Kommentare schreiben, nachgehen.
    Ich habe nun verstanden, was Mµ*e^13.5_?¿ meinte ;)

    PS: Böser Tippfehler :3
     
  17. iway

    iway Mitglied

    Dabei seit:
    12.10.2006
    Beiträge:
    43
    Zustimmungen:
    0
    Ort:
    Uttenreuth
    ok nur für mich nochmal!
    wer hat gewonnen ;P
     
Thema:

String-Return