Anfänger braucht Hilfe bei String-manipulation in C++



  • Erstmal ein Hallo an alle.
    Ich habe vor ca. einem Monat angefangen mich in C++ einzuarbeiten.
    Benutze dafür "C++ von A bis Z" von Jürgen Wolf.
    Hab efrüher mit VBA Excel zutun gehabt und würde gerne eine Permutation bzw. einen Textverdreher den ich damals im Net gefunden (und verstanden 😃 ) habe, in C++ zu übersetzen.
    Ich muss zugeben dass das nicht so einfach ist wie ich gedacht habe... 😮
    Habe das Prog erfolgreich Compiliert und getestet.
    Dabei tritt aber immer ein Problem auf:
    Wenn ich mehr als ein Zeichen eingebe, startet die Permutation und fängt an irgendwas zu schreiben, das nichts mit dem eingegeben Text zutun hat.
    Ich vermute den Fehler irgenwo in der for()-Schleife.
    Es war nicht ganz leich für mich die Mid(), Left() und Right() - Funktionen aus VBA zu übersetzen.
    Glaube das die sizeof()-Funktion an der Stelle nicht richtig ist...
    Habe es auch schon mit strlen() probiert, muss aber sagen dass ich mir mit Stringmanipulationen durch sizeof und strlen schwertu.

    Vieleicht hat ja jemand Interesse mir zu helfen bzw. einen Ansatz zu liefern, wie ich das hinbekomme... 😃

    Achso...
    Bevor jemand mit dem Argument kommt, dass es bereits eine Permutations-Funktion in einer der Bibliotheken gibt:
    Ich weiß...
    Ich will es aber selber machen 😉

    Vielen Dank !!!!

    Hier der Quelltext:

    #include <iostream>
    #include <cstring>
    using namespace std;
    
    void textverdreher(char x[],char y[]);          
    
    int main(void){
                   char eingabe[10];                        
                   cout << "Die Eingabe darf nicht mehr als 10 Zeichen enthalten!" << "\n\n";
                   cout << "Anagramm eingeben: ";
                   cin.getline(eingabe,10);
                   cout << "Eingabe : " << eingabe << "\n\n";
                   textverdreher("",eingabe);
                   system("Pause");
                   return 0;
                   }
    
    // Funktionen:
    void textverdreher(char x[],char y[])
    {
    int i=0,j=0;
    char xn[10],yn[10],z[10];
    j = strlen(y);
    if(j<2){
             strncpy(z,x,sizeof(x)-1);
             strncat(z,y,sizeof(y));
             cout << z << '\n';
             }
             else 
             {
             for(i=1;i<j;i++){
             //x+Mid(y,i,1),Left(y,i-1)+Right(y,j-1)
             strncpy(xn,x,sizeof(x)-1);                // xn = x
             strncat(xn,y+i,1);                        // xn = x+Mid(y,i,1)
             strncpy(yn,y,(i-1));                      // yn = Left(y,i-1)
             strncat(yn,(y+sizeof(y)+1-i),sizeof(y));  // yn = yn + Right(y,j-1)
             textverdreher(xn,yn);
             }
           }
    }
    
    // Code in VBA für Excel:
    //
    //Sub Textdreher(x As String, y As String)
    //   Dim i As Integer, j As Integer
    //   j = Len(y)                                             
    //   If j < 2 Then
    //      Zeile = Zeile + 1 
    //      Cells(Zeile, 1) = x & y
    //   Else
    //      For i = 1 To j
    //         Call Textdreher(x + Mid(y, i, 1), Left(y, i - 1) + Right(y, j - i))
    //      Next
    //   End If
    //End Sub
    


  • ->std::string
    (sollte übrigens gar nicht so schwer sein, wo Du doch schon in Deiner VB-Vorlage String einsetzt :p 😉 )

    Gruß,

    Simon2.





  • Danke für die Links!
    Werde das ganze nochmal durchgehen 😃 .



  • Du kannst das Ergebnis ja mal hier posten. Die Funktionen in cstring würde ich nicht mehr benutzen, wenn nicht unbedingt notwendig. Bei strncpy musst Du nach dem Abschneiden auf jeden Fall '\0' am Ende anfügen, damit der String terminiert.
    http://www.henkessoft.de/C++/C/arrays_pointer.htm

    H A L L O \0



  • Habe etwas geschrieben um zu sehen was die String-Funktionen bewirken.
    (Eben wegen der String terminierung)

    //TestString
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    int main(void) {
    char eingabe1[12];
    char eingabe2[12];
    char ausgabe3[14];
    int anzahl4;
    
    cout << "Eingabe 1 : ";
    cin.getline(eingabe1,12);
    cout << "Eingabe 2 : ";
    cin.getline(eingabe2,12);
    strncpy(ausgabe3,eingabe1,sizeof(ausgabe3)-1);
    cout << "strlen(eingabe1) : " << strlen(eingabe1) << "\n";
    strncat(ausgabe3,eingabe2,sizeof(ausgabe3)-1);
    anzahl4=strlen(ausgabe3);
    cout << "Ausgabe 3 : " << ausgabe3 << "\n";
    cout << "strlen(ausgabe3) : " << anzahl4 << "\n";
    system("Pause");
    }
    

    Da funktioniert alles... 😞
    Ich muss wohl wirklich auf andere Bibliotheken zurückgreifen...



  • Hallo,
    ich habe das selbe problem... 🙂
    Zwar jetzt nicht was dein Programm angeht, aber ich brauche such die Mid(), Left() und Right()-Funktion in C++! 🙄
    Gibt es da vieleicht schon was vorgefertigtes?? 😕

    MfG Johan



  • Hi ich bins nochmal 🙄 ,
    habe mich ein wenig mit deinem Code auseinander gesetzt...
    Ich glaube auch das es an der Stringterminierung ("\0") hängt...
    Aber mir ist auch was an deiner Right()-Funktion aufgefallen:
    Die +1 hat irgenwie keinen Sinn ergeben...
    Versuchs mal damit:

    strncat(yn,(y+sizeof(y)-i),sizeof(y));
    

    oder:

    strncat(yn,(y[(sizeof(y)-i)]),(strlen(y)+1-i);
    

    sorry...
    Blicke momentan selber nicht mehr durch 🙄



  • Hallo,
    habe wie von Simon und Henkes vorgeschlagen nun versucht die std::String zu benutzen.
    Wobei isch sagen muss das Simon sich für mein Gefühl ein wenig zu kurz gefasst hat... 😉
    Ergebnis wie folgt:

    // Funktionen:
    void textverdreher(string x,string y)
    {
    int i=0,j=0;
    string xn,yn,z;
    j = y.length();
    if(j<2){
             z = x + y;
             cout << z << "\n"; 
           }
      else {
             for(i=1;i<j;i++){
                          // xn = x+Mid(y,i,1)
                          xn = x + y.substr(i,1);                                   
                          // yn = Left(y,i-1) + Right(y,j-1)
                          yn = (y.substr(0,i-1)+ y.substr((y.length()-j+1),j));     
                          textverdreher(xn,yn);
                             }
           }
    }
    

    Diesmal funktioniert das ding schon ein wenig besser 😃
    Ich sehe wie er die Permutation ausführt, jedoch hat er irgendwann einen Knax ab und schreib nur noch den letzten Buchstaben in einer Endlosschlefe... 😡
    Und Müllt mir damit meinen Arbeitsspeicher voll!!!!!! 😡
    Man kann im Task manager richtig mitverfolgen wie die Speicherbelastung in 5MB/s steigt!!!!
    NAch beendigung des Programms bleibt dieser Müll natürlich erhalten...
    Ich glaube das nennt man Memory Leak.... 😕
    Hilfe!!



  • Du hast wahrscheinlich eine Endlosrekursion, das hat nicht direkt mit Memory Leaks zu tun. Allerdings sollte dir nach einiger Zeit das Programm abbrechen aufgrund eines Stack-Overflows.

    Geh doch mal mit dem Debugger durch und schaue, wo sich die Funktionen nicht so verhalten, wie du willst.



  • Wie mache ich das mit dem Debuggen unter Dev-C++???? 😕



  • Jin86 schrieb:

    Wie mache ich das mit dem Debuggen unter Dev-C++???? 😕

    Kleiner Tipp: Am besten gar nicht. Hol dir einen aktuellen Compiler + IDE und dann geht das ganz einfach. (wie kommt natürlich drauf an, welchen Compiler du wählst..)

    MSVC++ 08 Express, oder GCC + Code::Blocks ist empfehlenswert..



  • Dev-C++ ist doch eine aktuelle IDE die g++ als compiler benutzt...
    Oder irre ich mich da etwa??? 😕



  • Jin86 schrieb:

    Oder irre ich mich da etwa??? 😕

    Ja. Dev-C++ wird schon seit Jahren nicht mehr weiterentwickelt. Code::Blocks ist quasi der Nachfolger.



  • Würde Eclipse auch gehen???



  • Was kann ich mir unter Debuggen vorstellen??
    Läuft das den Code Zeile für Zeile ab wie ein Interpreter?



  • Jin86 schrieb:

    Was kann ich mir unter Debuggen vorstellen??
    Läuft das den Code Zeile für Zeile ab wie ein Interpreter?

    Ja, wenn du es so willst. Bei MSVC++ kannst du Haltepunkte setzen, bei denen der Code anhält, einzelne Anweisungen vorrücken, verschiedene Stackrähmen untersuchen und deren Variablenwerte prüfen, und so weiter.

    Benutz doch Google oder Wikipedia, da findest du massenweise Informationen über Debugger.



  • Jin86 schrieb:

    Würde Eclipse auch gehen???

    Eclipse geht auch, würde ich aber eher nicht empfehlen, halt rein weil es nicht dafür gebaut ist. Es geht bestimmt,aber da hat z.B VC Meilen vorsprung. Vor allem Debugger weiss ich nicht, wie gut der ist. Den von MS kann ich nur empfehlen. Bedingte Haltepunkte sind auch etwas sehr schönes. 😉



  • Alles klar...
    Habe mir sowas schon gedacht...
    Wusste aber nicht dass das auserhalb von Interpreter-Sprachen funktioniert... 😮
    Da ich das Programmieren aber momentan rein Hobby-mässig mache, wollte ich eigentlich keine Kohle für so sachen wie MSVC++ ausgeben... 😃
    Und die Express Edition soll glaube ich auch einen Harken haben...
    ich werde jetzt wohl noch ein wenig an meiner Permutation arbeiten und gucken wo ich den Fehler habe. 🙄
    Falls einer noch irgendwelche Tips hat, kann er sich gerne melden 😃
    Ansonsten bedanke ich mich schon mal im Vorraus für eure Hilfe!!!! 🙂



  • Jin86 schrieb:

    eigentlich keine Kohle für so sachen wie MSVC++ ausgeben... 😃
    Und die Express Edition soll glaube ich auch einen Harken haben...

    Du musst weder Geld ausgeben noch hat die Express-Version einen Haken. Wo hast du das gehört?

    Und selbst wenn einige Dinge nicht optimal sind, weit besser als Dev-C++ ist MSVC++ allemal...


Anmelden zum Antworten