Zeichenkette als Funktionsrückgabe



  • Hallo.

    Ich möchte mir ein Paar Text-Processing-Funktionen schreiben.
    Da ich erst mit C++ beginne, ist dies ein recht guter Einstiegspunkt, vor allem da jedes Programm Text verarbeiten muss. 🙂

    (Ja, ich erfinde das Rad neu.)

    Ich habe jetzt nur ein kleines Problem.

    Wie kann ich eine Zeichenkette aus einer Funktion zurückliefern, ohne AnsiString o.ä. zu verwenden?

    char GetToken (const char *pSTRING, const int &rTOKEN, const char &rDELIMITER) {
    
      int i = 0;
      char vResult[128] = "";
    
      if ( rTOKEN == 1 ) {
        while ( pSTRING[i] != rDELIMITER ) {
          vResult[i] = pSTRING[i];
          i = i + 1;
        }
        cout << vResult << endl;        //Dient der Funktionsüberprüfung.
        return vResult[0];
      }
      else {
        int vCurrentToken = 1;
        while ( pSTRING[i] != 0 ) {
          if ( pSTRING[i] == rDELIMITER ) {
            vCurrentToken = vCurrentToken + 1;
            if ( vCurrentToken == rTOKEN ) {
              i = i + 1;
              int CopyChar = 0;
              while ( pSTRING[i] != rDELIMITER ) {
                vResult[CopyChar] = pSTRING[i];
                CopyChar = CopyChar + 1;
                i = i + 1;
              }
              cout << vResult << endl;    //Dient der Funktionsüberprüfung.
              return vResult[0];
            }
          }
          i = i + 1;
        }
      }
    }
    
    int main(int argc, char* argv[]) {
        char test[60] = "Wort1.Wort2.Wort3.Wort4.Wort5.Wort6.Wort7.Wort8.Wort9.Wort10";
                                      //String, wievielte Token, Delimiter (Hier ein Punkt '.')
        cout << "Funktion " << GetToken(&test[0],5,46);
        cin >> test;
        return 0;
    }
    


  • einfach nen vierten parameter machen (char*) und dort dann das ergebnis reinschreiben.



  • Ah, ich probiers mal. 🙂

    Danke.



  • Du lieferst eine Zeier auf sie zurück.

    char* FunktionDieCharStringZurückgibt()
    {}
    

    Du musst aber drauf achten, dass wenn du eine Funktion verlässt der Stack mit
    den Variablen ungültigt wird. Das heißt, dass dein Variable die du in der
    Funktion erstellt hast ungültig ist.



  • Das ist quatsch. Du lieferst die erklärung schon selbst: Das objekt wird ungültig, sobald die funktion verlassen wird. Oder, falls das objekt mit new erstellt wird, muss sich der user um dessen löschung kümmern, was schlecht ist, da er es höchstwahrscheinlch vergisst.



  • char * const



  • const char& ist käse
    man nimmt
    char

    denn das ist nicht nur schneller und besser zu lesen, sondern drück das gewollte auch viel besser aus.



  • Mhm, also mir sagt das ganze noch nicht alzuviel.

    Aber es funktioniert jetzt. 🙂
    Ohne Erfolge macht das lernen keinen Spass, demnach war das jetzt sinnvoll, egal wie schlecht der Code auch seien sollte. 🙂

    Der erste Vorschlag war für mich als einziges realisierbar 😉 ;

    #include <iostream.h>
    
    int GetToken (const char *pSTRING, const int &rTOKEN, const char &rDELIMITER, char *rResult) {
      int i = 0;
      if ( rTOKEN == 1 ) {
        while ( pSTRING[i] != rDELIMITER ) {
          rResult[i] = pSTRING[i];
          i = i + 1;
        }
        return 0;
      }
      else {
        int vCurrentToken = 1;
        while ( pSTRING[i] != 0 ) {
          if ( pSTRING[i] == rDELIMITER ) {
            vCurrentToken = vCurrentToken + 1;
            if ( vCurrentToken == rTOKEN ) {
              i = i + 1;
              int CopyChar = 0;
              while ( pSTRING[i] != rDELIMITER ) {
                rResult[CopyChar] = pSTRING[i];
                CopyChar = CopyChar + 1;
                i = i + 1;
              }
              return 0;
            }
          }
          i = i + 1;
        }
      }
    }
    
    int main(int argc, char* argv[]) {
        char vString[60] = "Wort1.Wort2.Wort3.Wort4.Wort5.Wort6.Wort7.Wort8.Wort9.Wort10";
        char vResult[128] = "";
        GetToken(&vString[0],1,46,&vResult[0]);
        cout << "Result: " << vResult << endl;
        cin >> vString;
        return 0;
    }
    

    Wenn jemand Lust hat, mit rumzuwerkeln, alle Vorschläge sind gerne willkommen.
    Möchte daraus einmal eine Klasse machen. 🙂

    z.B. gibt es noch das Problem, das die Funktion nicht überprüft, ob es überhaupt einen Token gibt und demnach wird, insofern man das erste Token verlangt, der ganze String als Result ausgegeben, was bei einem Blob... 😃

    Dachte evt. daran, wenn ich eine Klasse daraus mache, das ich im Konstruktor ein Array erstelle, welches alle ASCII Zeichen beinhaltet (bool) und eine Prozedur den ganzen String durchgeht und schaut, ob der übergebene Delimiter überhaupt existiert.

    Aber das braucht alles wieder Rechenzeit... 😞


Anmelden zum Antworten