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