Palindromtest mit einem Typ string als Rückgabewert
-
@Cusher sagte in Palindromtest mit einem Typ string als Rückgabewert:
word2=word[i];
Damit weist du word2 jedesmal einen neuen Wert zu.
Das Zeichen, das an der Stelle i in dem String word steht.
-
Mal ne andere (ähnliche) Frage, warum kompiliert
std::string a = "test"; std::string b; b = a[1];
Während
std::string a = "test"; std::string b = a[1];
Eine "conversion from non-scalar type requested" warnung wirft? Ist es weil es keinen Konstruktor für den zweiten Fall gibt?
-
@alfons19 Genau. Schau dir die Liste der string-Konstruktoren an:
http://www.cplusplus.com/reference/string/string/string/und vergleiche sie mit dem Zuweisungsoperator:
http://www.cplusplus.com/reference/string/string/operator=/Dein unterer Code ruft den Konstruktor auf (obwohl von der Syntax her ein = dort steht), aber da gibt es keinen, der einen char nimmt.
-
Dieser Beitrag wurde gelöscht!
-
Dieser Beitrag wurde gelöscht!
-
#include <string> #include <iostream> #include <algorithm> /* Programmieren Sie eine Funktion dreh, die einen als string übergebenen Text * umdreht und den gedrehten Text als Rückgabewert vom Typ string zurückgibt. */ std::string dreh(std::string str) { std::reverse(str.begin(), str.end()); return str; } int main() { // Schreiben Sie ein Programm, dass mit cin einen Text einliest. std::string text; std::cin >> text; // Vergleichen Sie den eingelesenen Text mit dem Resultat der Funktion dreh. bool ist_palindrom{ text == dreh(text) }; // Geben Sie anschließend das Resultat (Der Text ist ein / ist kein Palindrom) am Bildschirm aus. std::cout << "Det Text " << (ist_palindrom ? "ist ein" : "ist kein") << " Palindrom.\n\n"; }
Zu Fuß ohnekaupt. siehe unten.<algorithm>
undstd::reverse
:std::string dreh(std::string str) { auto laenge{ str.length() }; for (std::size_t i{}; i * 2 < laenge; ++i) str[i] = str[laenge - i - 1]; return str; }
-
@Swordfish sagte in Palindromtest mit einem Typ string als Rückgabewert:
Zu Fuß ohne <algorithm> und std::reverse:
std::string dreh(std::string str) { auto laenge{ str.length() }; for (std::size_t i{}; i * 2 < laenge; ++i) str[i] = str[laenge - i - 1]; return str; }
Das kopiert dir die hintere Hälfte des Strings umgedreht nach vorne.
Aus "ab" wird dann "bb".Will man das?
-
Hallo @Cusher,
mein Lehrer in der Schule mochte Rekursion:std::string dreh(std::string str) { if (str.length() <= 1) return str; return dreh(str.substr(1)) + str[0]; }
Aufgabe für dich: Diskutiere Vor- und Nachteile. Bonusfrage: wäre es sinnvoll, hier std::string_view zu verwenden und/oder sollte man hier irgendwo
const&
einfügen?
-
@DirkB wahrscheinlich sollte da ein swap rein und wurde vergessen...
-
@HarteWare sagte in Palindromtest mit einem Typ string als Rückgabewert:
@DirkB wahrscheinlich sollte da ein swap rein und wurde vergessen...
Ja.
Sorry, richtig rum:
std::string dreh(std::string str) { auto laenge{ str.length() }; for (std::size_t i{}; i * 2 < laenge; ++i) std::swap(str[i], str[laenge - i - 1]); return str; }
noch zufußer (guckst Du Dreieckstausch):
std::string dreh(std::string str) { auto laenge{ str.length() }; for (std::size_t i{}; i * 2 < laenge; ++i) { auto temp{ str[i] }; str[i] = str[laenge - i - 1]); str[laenge - i - 1]) = temp; } return str; }
peinlich, peinlich
PS: Wahrscheinlich sollte man
decltype(laenge) i{}
nehmen wenn man schonauto laenge{ str.length() };
schreibt.
-
@Swordfish Neulich hat hier ein Forenmitglied Schulnoten verteilt.
-
@DirkB Ja, der Faux-pas gibt ne glatte 5.