C-String in umgekehrter Reihenfolge zurückliefern



  • Zuerst einmal zum Code

    #include <iostream>
    using namespace std;

    // Prototypendeklaration
    char* reverseText( char* pCString );

    // Implementation
    char* reverseText( char* pCString ){

    //hier soll dann mein code rein
    }

    // Applikation
    int main(){

    // Deklaration + init
    char txt[] = "Hallo Velo";
    char* p = reverseText (txt);
    cout << p << endl;
    if ( p != 0 ) delete [] p;
    return 0;
    }



  • hochoptimiert, speziell und ungetestet:

    const char *reverseText( char* pCString )
    {
        return "oleV ollaH";
    }
    


  • Zunächst mal ist

    if ( p != 0 ) delete [] p;
    

    Ziemlicher Blödsinn. Erstens machen delete und delete[], auf nen null-pointer angewandt, nichts, und zweitens zeigt p nicht auf einen mit new angeforderten Speicherbereich. Zweitens:

    #include <algorithm>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
      string txt = "Hallo Velo";
      reverse(txt.begin(), txt.end());
      cout << txt << endl;
    }
    


  • Ich würds so machen wenn du nix forgefertigtes verwenden darfst.

    #include <iostream>
    #include <conio>
    using namespace std;
    
    // Prototypendeklaration
    char* strEnd(char *);
    unsigned int strLen(char *);
    void strReverse(char*, char*);
    
    // Implementation
    
    char* strEnd(char* pSource)
    {
        while(*pSource)
            ++pSource;
        return pSource;
    }
    
    unsigned int strLen(char* pStr)
    {
        return strEnd(pStr)-pStr;
    }
    
    void reverseText( char * pSource, char* pTarget )
    {
        // Größe und Ende des Strings ermitteln
        char* pEnde = strEnd(pSource);
        unsigned int uiSize = pEnde-pSource;
    
        // String von hinten auslesen
        for(unsigned int i = 0; i<uiSize; ++i)
        {
            --pEnde;
            *pTarget = *pEnde;
            ++pTarget;
        }
        *pTarget = 0;
    }
    
    // Applikation
    int main(){
    
        // Deklaration + init
        char txt[100];
    
        // Eingabe
        cin >> txt;
    
        // Alloc
        char* rev = new char[strLen(txt)];
    
        reverseText (txt, rev);
        cout << rev << endl;
    
        // Free
        delete [] rev;
    
        getch();
        return 0;
    }
    


  • #define MAXLEN 1024
    
    char *reverse (char *s)
    {
        static char r[MAXLEN];
        int i = MAXLEN-1;
        r[i--] = 0;
        while (*s)
            r[i--] = *s++;
        return &r[i+1];         
    }
    


  • hier meine version:

    #include<cstring>
    
    char
    *reverse (char *str)
    {
      char *start = str,
           *end   = str+strlen(str)-1,
            c;
    
      while(start<end)
      {
        c=*start;
        *start++=*end;
        *end--=c
      }
    
      return str;
    }
    

    die kannst du auch mit revstr=reverse(strdup("Hallo Velo")) aufrufen.



  • Hallo,
    oder "in-place"

    void rev(char* str)
    {
    	char* last = str + strlen(str);
    	while (str < last)
    	{
    		char t = *str;
    		*str++ = *--last;
    		*last = t;
    	}
    }
    


  • so kann man es natürlich auch machen. nur leider benutze ich VC++6 🤡
    da gewöhnst du dir vernünftigen programmierstil schnell ab.



  • Sind wir hier im C-Forum oder was?

    #include <string>
    #include <algorithm>
    
    std::string s("Hallo");
    std::reverse(s.begin(), s.end());
    

    Wenn der orig. String nicht geändert werden soll, kann man auch reverse_copy benutzen.



  • Sind wir hier im C-Forum oder was?

    Nope. Aber zeigst du mir bitte die Stelle im C++ Standard, in der steht, dass nullterminierte char-Arrays verboten sind.

    Ich bevorzuge persönlich natürlich ebenfalls std::strings. Nur:
    1. schien der OP char* verwenden zu wollen.
    2. gibt es genug Code auf der Welt der char* verwendet und damit ist es definitiv nicht verkehrt, wenn man lernt damit umzugehen.

    Zu deinem Codebeispiel:
    In wiefern unterscheidet sich das von 0xdeadbeefs Lösung?



  • Sorry, 0xdeadbeefs Lösung hab ich nicht mitbekommen. Wurde von den C-Lösungen erschlagen.

    Was die Arrays angeht: wir programmieren hier doch alle in C++ um das OO-Paradigma einzusetzen oder? Klar steht im Standard nicht drin, das man keine char-Arrays benutzen darf. Aber wenn es danach gehen würde... 🙄 Und vielleicht weiß es der OP einfach nicht besser?



  • wir programmieren hier doch alle in C++ um das OO-Paradigma einzusetzen oder?

    Keine Ahnung wer "wir" sind, aber ich für meinen Teil programmiere nicht deshalb in C++. Wenn OOP meine einzige Sorge wäre, würde ich in einer Sprache wie Smalltalk o.Ä. programmieren.
    Ich schätze an C++ gerade die Flexibilität die es einem ermöglicht auch andere Ansätze zu verfolgen.



  • Konfusius schrieb:

    so kann man es natürlich auch machen. nur leider benutze ich VC++6 🤡
    da gewöhnst du dir vernünftigen programmierstil schnell ab.

    wen der bauer nicht schwimmen kann, sagt er, die badehose sei kaputt.

    #define for if(false);else for
    
    #include <iostream>
    using namepsace std;
    
    int main(){
       for(int i=0;i<10;++i)
          cout<<i<<' ';
       for(int i=10;i>0;--i)
          cout<<i<<' ';
       return 0;
    }
    


  • Vielen Dank für eure Beiträge, einige davon waren ja sehr nützlich wenn auch teilweise ein wenig zu heftig für den moment für mich ;-).

    Grosser dank an Volkars C++ Kurs, dein Online Referenz hat mir schon oft gute Unterstützung geboten.



  • wenns nur um die ausgabe geht könnte man es auch so machen:

    #include <iostream>
    #include <algorithm>
    #include <iterator>
    int main(){
         char txt[] = "Hallo Velo";
         std::reverse_copy(txt,txt+strlen(txt),std::ostream_iterator<char>(std::cout));
    }
    

    Was die Arrays angeht: wir programmieren hier doch alle in C++ um das OO-Paradigma einzusetzen oder?

    irgendwie nicht(zumindest nicht pur).



  • Artchi schrieb:

    Sind wir hier im C-Forum oder was?

    Ja, und du bist mal wieder der Horst 🙂


Anmelden zum Antworten