Palindrom
-
Hallo c++ Community
Ich soll einen Programm schreiben, der Palindrom Text erkennt
Der eingelesene Text :
1.soll ohne Leerzeichen und Sonderzeichen ausgegeben.
2. soll in der umgekehrte Folge ausgegeben.
3. Nach reserve ,die neue Länge.
4. Ob es sich um einen Palindrom handelt oder nicht.
Alles hat funktioniert, außer die Länge des Textes nach reserve.
Ich konnte die Länge der eingelesene Text ermitteln
Habe auch gegoolt und habe nichts passendes gefunden.
Ihr seid meine letzten Hoffnungen.
Übrigens ich bin noch einen Anfänger
Danke schon mal
Hier ist mein Code#include <iostream> #include <string> #include <cctype> #include <bits/stdc++.h> using namespace std; string clean(const string& s); bool isPalindrome(const string& s); string clean(const std::string& s) { string fixed=""; //initially empty char c; // a character to examine int sLength = s.length( ); for (int i = 0; i < sLength; i++){ c = s.at(i); if (!ispunct(c) && !isspace(c)) fixed += c; } return fixed; } string reverse(const string& s) { string rev = clean(s); reverse(rev.begin(), rev.end()); return rev; } bool isPalindrome(const string& s){ int i,j; i=0; j=s.length()-1; while(i<j) { //removing spaces and special characters while(i<j && isalnum(s[i])==0) i++; while(i<j && isalnum(s[j])==0) j--; //Checking if not palindrome if(toupper(s[i])!=toupper(s[j])) { return false; } else { i++; j--; } } return true; } int main( ){ string str; string fixed; cout << "Geben Sie eine Zeile ein: \n"; getline(cin, str); cout << endl; cout<<"Ohne Sonderzeichen: "; cout<<clean(str); cout << endl; cout<<"Laenge: "; cout<<str.length(); cout << endl; cout << endl; cout<<"Umgekehrte Reihenfolge: "; cout << reverse(str); cout << endl; cout << endl; int ans=isPalindrome(str); if(ans==1) cout<<"Palindrom? Ja."; else cout<<"Palindrom? Nein."; cout << endl; return 0; }
-
Bearbeite bitte Deine Frage und rück' Deinen Code erstmal vernünftig ein. So will das niemand lesen.
-
reserve
? Oder doch reverse? Umdrehen ändert natürlich nicht die Länge. Das passiert höchstens bei ohne Leerzeichen und Sonderzeichen.
-
@manni66
ja ich meinte reverse umdrehen
Nach dem löschen der Sonderzeichen un Leerzeichen ändert sich die Länge des Satzes
Das passiert bei string clean
Wie kann ich es machen?
-
auto foo = reverse(str); std::cout << foo << '\n'; std::cout << "Laenge: " << foo.length() << '\n';
@Swordfish sagte in Palindrom:
Bearbeite bitte Deine Frage und rück' Deinen Code erstmal vernünftig ein. So will das niemand lesen.
-
Die Palindrom-Check-Funktion kannst du drastisch kürzen. Sieh dir hierzu das Beispiel auf der Referenz an:
-
...und auch das clean geht einfacher. Such einfach mal nach dem erase-remove-Idiom.
std::string clean(std::string s) { s.erase(std::remove_if(s.begin(), s.end(), [](char c){return ispunct(c) || isspace(c);}), s.end()); return s; }
-
[](char c){return ispunct(c) || isspace(c);}
char
ist eine schlechte Idee weil dieis...()
Funktionen aus<cctype>
UB auf negative Werte haben undchar
auchsigned
sein kann....und auch das clean geht einfacher.
Klar ist die ganze Aufgabenstellung auch viel kürzer zu lösen
Ich soll einen Programm schreiben, der Palindrom Text erkennt
Der eingelesene Text:- soll ohne Leerzeichen und Sonderzeichen ausgegeben [werden].
- soll in der umgekehrte Folge ausgegeben [werden].
- Nach reserve, die neue Länge. [*]
- Ob es sich um einen Palindrom handelt oder nicht.
#include <cctype> #include <string> #include <algorithm> #include <iostream> std::string remove_space_and_punct(std::string str) noexcept { str.erase(std::remove_if(std::begin(str), std::end(str), [](char unsigned ch) { return std::isspace(ch) || std::ispunct(ch); }), std::end(str)); return str; } std::string reverse(std::string str) noexcept { std::reverse(std::begin(str), std::end(str)); return str; } int main() { std::string input; std::getline(std::cin, input); auto input_reversed{ reverse(input) }; auto input_stripped{ remove_space_and_punct(input) }; std::cout << "Original: \"" << input << "\"\n" "Whitespace and punctuation marks removed: \"" << input_stripped << "\" " "(Length: " << input_stripped.length() << ")\n" "Reversed: \"" << input_reversed << "\n" "It" << (input != input_reversed ? " is not" : "'s") << " a palindrome.\n\n"; }
... ist nur die Frage, ob jemand der noch mit Variablen und Rückgabewerten strauchelt da noch durchblickt
* ) Gibt keinen Sinn. Nach "reverse" ist der Text genau so lang wie zuvor.
#include <bits/stdc++.h>
Lass das. Das ist kein Standard-Header.