Programm-Problem Palindrom
-
Hallo,
ich muss für die Uni bis morgen ein Programm fertig schreiben, bekomme es jedoch nicht hin..
Ziel ist es, einen String erst in Kleinbuchstaben umzuwandeln und anschließend alle Zeichen bis auf Buchstaben zu entfernen. Wir dürfen recht wenig benutzen, keine Pointer usw. Wir haben gerade erstmal die if, for und while-Anweisung durchgenommen.
Das habe ich bis jetzt schon geschrieben:#include <iostream> #include <cctype> #include <string> #include<stdio.h> std::string to_lower(std::string s) { for (int i=0; i<=s.size();++i) {s[i]=std::tolower(s[i]);} return s; } std::string letters_only(std::string n) { int counter, counterWrite=0; std::string workingCopy; for(counter=0;counter<n.size();counter++) { if (isalpha (n[counter])) { workingCopy[counterWrite]=n[counter]; counterWrite++; } } int inputLenght = workingCopy.size(); n=workingCopy; return n; } bool is_palindrom(std::string s) {} int main () { std::string s; std::cout <<"\n"; std::cout<<"Geben sie EIN(!) beliebiges Wort ein:\n"; std::cin>>s; std::cout <<"\n"; std::string n=to_lower(s); std::cout <<"Alles klein: "<< letters_only(n) <<"\n"; return 0; }
Das Problem ist, dass er den String WorkiingCopy nicht ausgeben will, bzw. denkt er wäre leer? Was er evtl auch ist, falls ich etwas falsch gemacht habe..
Die Funktionsköpfe sind von der Aufgabenstellung vordefiniert, müssen also std:string sein, keine char!Ich hoffe ihr könnt mir schnellstmöglich helfen.
Grüße
-
Strings fangen leer an (sofern man ihnen keine Inhalt gibt). Wenn du dann später auf bestimmte Zeichen eines solchen Strings zugreifst (wie in Zeile 23), wird der String nicht automatisch erweitert. Vielleicht suchst du eher append, operator+=, insert, push_back oder eine der vielen anderen Methoden, um einen String Inhalt zuzufügen.
-
SeppJ schrieb:
Strings fangen leer an (sofern man ihnen keine Inhalt gibt). Wenn du dann später auf bestimmte Zeichen eines solchen Strings zugreifst (wie in Zeile 23), wird der String nicht automatisch erweitert. Vielleicht suchst du eher append, operator+=, insert, push_back oder eine der vielen anderen Methoden, um einen String Inhalt zuzufügen.
Also so?
workingCopy[counterWrite].append(n[counter]); //workingCopy[counterWrite]=n[counter]; counterWrite++;
-
Wozu brauchst du den counterwrite noch?
-
Klassische Einzeiler:
std::string to_lower(std::string s) { return std::transform(s.begin(),s.end(),s.begin(),(int(*)(int))std::tolower),s; }
std::string letters_only(std::string s) { return s.erase(std::remove_copy_if(s.begin(),s.end(),s.begin(),[](char c){return!std::isalpha(c);})-s.begin()); }
bool is_palindrom(std::string s) { return std::equal(s.begin(),s.begin()+s.size()/2,s.rbegin()); }
-
Nibako schrieb:
lower(std::string s) { for (int i=0; i<=s.size();++i) {s[i]=std::tolower(s[i]);}
Schau dir die Grenzen an (insbesondere die obere)! Aber da du über alle Chars des Strings loopst, bietet sich doch eine Loop ohne Index an:
for (auto &c : s) { c = std::tolower(c); }
Tipp: wenn du nicht unbedingt eine Index-Variable brauchst, verzichte auf diese! Wenn du im foreach-Style loopst, sind die Grenzen automatisch immer richtig.
Alternativ benutze std::transform, wie vom Einzeller vorgeschlagen.