Funktion gibt Array nicht mehr zurück

Lark

Mitglied
Guten Abend zusammen,

Also ich gehöre zu den C++ Anfängern, also entschuldigt, wenn ich irgendwas nicht wirklich sauber programmiert hab. Könnt mich aber gerne darauf hinweisen. ;)
Und natürlich hab ich auch schon nach einer Lösung gesucht, hab aber keine finden können, sonst hät ich ja auch nicht gefragt. :-)

Naja, nun zu meinem Problem.
Ich habe einmal meine main.cpp und die strfunc.h
in der strfunc.h ist die Klasse "strfunc" deklariert.
Die Funktionen
str.bereich(string str,string start,string end) und
str.str_replace(string str,string search,string replace) greifen beide auf die Funktion
str.spiltstring(string str, string search)
zu.

Code:
 array=str.bereich(row,"[Anfang]","[Ende]");//Dies funktioniert noch
Hier funktioniert die Funktion spiltstring() noch wunderbar.
Der String wird wie verlangt bei den Leerzeichen getrennt und die einzelnen Abschnitte als Array zurückgegeben.

Code:
temp = str.str_replace(temp,"[Pfad]","Bild");//Hier funktioniert es nicht mehr.
Hier erfolgt von der Funktion splitstring keine Rückgabe mehr.
Die Bedinung, sind meines Erachtens nach aber doch die Gleichen, wie die bei der obigen Funktion, oder etwa nicht?

Ach ja vlt. noch 2 Worte zu dem Programm selbst.
Das Programm soll einen Text auslesen und dort erst einmal eine Textpassage raussuchen die durch [Anfang] und [Ende] gekennzeichnet ist. In dieser Passage findet man [Pfad] der später durch den Pfad eines Bilder ersetzt werden soll.

Hier noch die beiden Dateien:

main.cpp :
Code:
#include <iostream>
#include <fstream>
#include <string>
#include "strfunc.h"
using namespace std;

int main(){
    const char *temp_filename="temp.txt"; //Für Temporäre Datei

    strfunc str;//Klasse
    //Variablen
    int start=0,ende=0,y=0;
    string *array=new string[5];
    string befor;
    string between;
    string after;
    string row,temp;

    
    ifstream input("index.html");//Datei einlesen
    while(getline(input,row)){
          //input>>row;
          array=str.bereich(row,"[Anfang]","[Ende]");//Dies funktioniert noch
          if(array[1]=="true"){
                start=1;
                y=0;
          }
          if(array[3]=="true"){
                ende=1;
                start=0;
                y=0;
          }
          temp=array[0]+array[2]+array[4]+"\n";
          if(start==0 && ende==0){
               befor+=temp;
          }else if(start==1){
                between+=temp;
          }else{
                after+=temp;
          }
    }
    input.close();
    ofstream otempstream(temp_filename);
    otempstream<<between;
    otempstream.close();
    
    ifstream itempstream1(temp_filename);

    y=0;
    while(getline(itempstream1,temp)){
        y++;
    }
    string *temparray=new string[y+1];
    itempstream1.close();
    
    ifstream itempstream2(temp_filename);
    y=0;
    while(getline(itempstream2,row)){
        temp=row;
        temp = str.str_replace(temp,"[Pfad]","Bild");//Hier funktioniert es nicht mehr.
        cout<<endl<<"temp:"<<temp<<endl;
        y++;
    }
    temparray[y]="\0";
    itempstream2.close();

    ofstream output("temp.html");
    output<<befor;
    y=0;

    output<<after;


}
strfunc.h :
Code:
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
class strfunc{
 public:     
    string* spiltstring(string str, string search);
    string* bereich(string str,string start,string end);
    string str_replace(string str,string search,string replace);
};
string* strfunc::spiltstring(string str, string search){   
    //Variablen
    string::const_iterator x;
    string y,wort;
    int found=0,z=0;
    //Anzahl der Zeichen "Search" ermitteln
    for(x=str.begin();x!=str.end();x++){
         y=*x;
         if(y==search){
            found++;
         }    
    }
    string *array=new string[(found+2)];//Variablen für die einzelnen Wörter
    
    for(x=str.begin();x!=str.end();x++){
         y=*x;
         if(y==search){        
             array[z++]=wort;
             wort="";     
         }else{
               wort+=y;
         }
    }
    array[z]=wort;
    array[++z]="\0";
    return array;
}//spiltstring

string* strfunc::bereich(string str,string start,string end){
    //Variablen
    string *arr=new string;
    string check;
    int anfang=0,ende=0,y;
    string bfa,btae,ne;
    string *array=new string[5];
    array[1]="false";
    array[3]="false";
    arr=spiltstring(str," ");
    int x=0;
    while(arr[x]!="\0"){
            check=arr[x];
            if(check==start){
                  y=0; 
                  anfang=1;
                  ende=0;
                  x++;
                  array[1]="true";
                  continue;
            }
            if(check==end){
                  y=0;
                  ende=1;
                  anfang=0;
                  x++;
                  array[3]="true";
                  continue;
            }
            
            if(anfang==1){
                 btae+=" "+check;
            }else if(ende==1){
                  ne+=+" "+check;
            }else{
                  bfa+=" "+check;
            }
            x++;
    }
    
    array[0]=bfa;
    array[2]=btae;
    array[4]=ne;
    return array;
}
string strfunc::str_replace(string str,string search,string replace){
    //Variablen
    string *array=new string;
    string check,ret;
    
    array=strfunc::spiltstring(str," ");
    cout<<"array[0]:"<<*array;
    int x=0;
    while(array[x]!="\0"){
            check=array[x];
            if(check==search){
                 check=replace;
            }
            ret+=" "+check;
            x++;
    }
    return ret;
}


Vlt. fällt dem ein oder anderen ja ein Lösungsvorschlag ein.
Vielen Dank,
Marcel
 
Wenn ich mir deinen Code so anschaue, fällt mir so direkt mal die Verwendung von 'array' auf -> erst reservierst
du 5 string Objekte, dann schreibst du die Adresse nach array, und dann überschreibst du diese Adresse
mit dem Rückgabewert deiner Funktion, in der du ebenfalls 5 Objekte reservierst hast.
Damit sind die ersten 5 Objekte verloren, denn du weißt nicht wo sie im Speicher stehen. Wenn du array
in deiner Funktion nutzen willst, musst du sie als Referenz oder mit Pointer übergeben, und nicht neu reservieren

Mein Tipp für dich: Schau dir dringend nochmal die Verwendung von new und speziell delete an

Soweit erstmal, schau erstmal was du damit machen kannst

PS: Für einen Anfänger hast du dir ziemlich viel Kram für den Anfang aufgehalst!
 
Hi.
C Coder hat gesagt.:
Mein Tipp für dich: Schau dir dringend nochmal die Verwendung von new und speziell delete an
Oder du läßt diese ganze Speicherverwaltung mit new und delete einfach weg und nimmst lieber einen std::vector anstatt eines C-Arrays. Erstens ist es doch irgendwo lästig und gefährlich (wenn man nicht wirklich aufpasst) den Speicher immer selbst zu erstellen und freigeben zu müssen und zweitens ist die Verwendung eines Vektors viel "C++-mäßiger" :).

Code:
#include <vector>
#include <iostream>
#include <sstream>
#include <iterator>

#include <cassert>

using namespace std;

vector<string>
split (const string& str, const string& delim = " ") {
  assert (!delim.empty ());

  vector<string> result;
  string::size_type start = 0, end;

  while ((end = str.find (delim, start)) != string::npos) {
    if (start < end) {
      result.push_back (str.substr (start, end - start));
    }
    start = end + delim.length ();
  }
  result.push_back (str.substr (start));

  return result;
}


int main ()
{
  string x = "What we have here is a failure to communicate";

  vector<string> sp = split (x);

  copy (sp.begin(), sp.end(),
        ostream_iterator<string> (cout, "\n"));
}
 
Hallo,

danke schon einmal für die Antworten.

Werde mich heute Abend den Vektoren noch einmal hingeben.

PS: Für einen Anfänger hast du dir ziemlich viel Kram für den Anfang aufgehalst!

jap, das scheint so zu sein,
naja, hoffe aber mal das ich das mit meinen Programmierkenntnissen von vor C++, dennoch umsetzen kann.

Gruß,
Marcel
 
Zurück