String-Return

G

gruenpflanze

Mitglied
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;   
}
 
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;
}
/*--------------------------------------------------------*/
 
Zuletzt bearbeitet:
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 "}".
 
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 "}".

Exakt. :)
 
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 "}".
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.
 
Mµ*e^13.5_?¿ schrieb:
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.
Nochmals: Der "normale" string inp kann gar nicht explizit freigegeben werden, es ist kein Zeiger.
 
Nochmals: Der "normale" string inp kann gar nicht explizit freigegeben werden, es ist kein Zeiger.
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.
 
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.

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.
 
Zuletzt bearbeitet:
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.
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.
 
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.
Autsch. Wieder einer, der nicht kapiert hat, war ein Pointer ist.
 
@dietox: Dein Code produziert ein memory leak, verursacht durch das überflüssige erste new[].

Der Rückgabewert der Funktion text() ist nur eine 32bit lange Ganzzahl, sonst nichts. Eine "Array-Zuweisung" findet nicht statt. Desweitern verweise ich auf die Ausführungen von Mµ*e^13.5_?¿

@gruenpflanze: Was eine alternative Implementierung anbetrifft:

- Schau Dir mal die STL-Containerklassen an.
- Lerne std::autoptr zu benutzen.
- Für genau zwei Strings, verwende std::pair<string, string>.
- Wenn es gar nicht anders geht, verwende ein konstantes Array; das kann man als Typ zurückgeben.
 
Zuletzt bearbeitet:
@dietox: Dein Code produziert ein memory leak, verursacht durch das überflüssige erste new[].

Der Rückgabewert der Funktion text() ist nur eine 32bit lange Ganzzahl, sonst nichts. Eine "Array-Zuweisung" findet nicht statt. Desweitern verweise ich auf die Ausführungen von Mµ*e^13.5_?¿
Also, zum xten Mal: Ich habe es verstanden :)
 
So richtig "ordentlich" (hier ohne dynamischen Speicher):
Code:
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
#include <vector>
#include <functional>

using namespace std;

void string_split(const string& input, vector<string>& splitted_input)
{
	string tmp;
	istringstream iss (input);

	while ( ::getline(iss, tmp, ' ')) 
		if ( tmp.length() > 0)
			splitted_input.push_back( tmp);
}

struct printer : public unary_function<string, void> {
	unsigned int _i;
	
	printer ( ) : _i ( 1 ) {;}
	
	void operator() (string& s) {
		cout << "[" << (_i++) << "] " << s << endl;
	} 
};

int main()
{
    vector<string> splitted_input;
    string input;
    
    cout << "Bitte Vor- und Zunamen angeben: ";
    getline(cin, input);
    
    string_split(input, splitted_input);
    
    for_each(splitted_input.begin(), splitted_input.end(), printer()); 

    return 0;
}
 

Ähnliche Themen

String auf Konsole ausgeben

deprecated conversion from string constant to ‘char*’

Problem mit Texteingabe

wxPython Problem

dynamische Speicherreservierung

Zurück
Oben