0
Zunächst einmal ist deine letzte Zeile falsch, da muss ja
printf("Text umgekehrt: %s", umgekehrt);
stehen, du willst ja nicht den Originaltext wieder ausgeben.
Der andere Fehler besteht in deinem Handling der Länge pos bzw. dann der Schleife.
Folgendes Szenario: Der Nutzer gibt "abcd" ein und drückt Enter.
text = "abcd\n";
pos = strlen(text); // =5, denn \n wird mitgezählt
text[pos-1] = 0; // Überschreiben des Newline mit \0 liefert text = "abcd\0"
Jetzt ist der Fehler in deiner Schleife, denn pos ist weiterhin 5. Du sortierst den String richtig um, aber durch \0 an Index 4 steht das nun am Beginn:
text = "abcd\0";
umgekehrt = "\0abcd";
Und dann bekommst du eine leere Nachricht auf der Konsole, denn wie strlen geht auch printf("%s") auf die Suche nach \0, wird sofort fündig und gibt den Rest nicht aus.
Ich würde dir einfach empfehlen das Überschreiben wegzulassen und
pos = strlen(text) - 1;
zu wählen.
Noch ein paar weitere Tipps:
Deklarier Variablen erst dort wo du sie brauchst und so weit verschachtelt wie möglich.
Also:
int pos = strlen(text) - 1;
und
for (int i = 0; i < pos; i++)
{
char c = text[pos - 1 - i];
umgekehrt[i] = c;
}
wobei du hier gar keine Variable brauchst:
for (int i = 0; i < pos; i++)
{
umgekehrt[i] = text[pos - 1 - i];
}
Das macht den Code deutlich übersichtlicher.
Edit:
Der reine C++ Weg würde zum Beispiel so aussehen:
#include <algorithm>
#include <iostream>
#include <string>
int main()
{
std::string input;
std::getline(std::cin, input);
// Remove whitespaces
std::erase(input, ' ');
// Create reversed copy
std::string reversed = input;
std::reverse(reversed.begin(), reversed.end());
if(reversed != input)
{
std::cout << "No ";
}
std::cout << "Palindrome detected\n";
}
Diese Antwort melden
Link
geantwortet
vetox
Punkte: 160
Punkte: 160
Hab den Code abgeändert und es klappt, danke! Für den Vergleich von text und umgekehrt habe ich die Funktion strcmp() angewendet. Palindrome aus einzelnen Worten werden so erkannt. Allerdings nicht welche mit Leerzeichen wie z.b. "der freibierfred". Wüsstest du hierfür noch eine Möglichkeit wie man hier das Leerzeichen wegkriegt bzw. wie das Palindrom trotzdem erkannt wird?
─
userff3c29
07.06.2024 um 07:20
Das kommt ein bisschen drauf an. Dein aktueller Code ist mehr C als C++, denn in C++ würde man wahrscheinlich eher den dynamischen Typ std::string verwenden und auch beim Einlesen eher std::cin statt fgets. Die Arbeit mit std::string ist dann meist etwas einfacher und ein Löschen der Whitespaces wäre mit string::erease schnell gemacht. Aber in deinem aktuellen Code mit char Arrays musst du eine Schleife machen die Whitespaces sucht. Das kannst du sogar recht elegant ohne ein weiteres Array lösen. Mach dir eine Schleife die dein Array durchgeht und im originalen Array den aktuellen Wert mit dem nächsten überschreibt, wenn der aktuelle Wert ein Whitespace ist. Hierbei musst mit einem char Pointer den aktuellen "Offset" mitspeichern. Die Frage wäre eher: Hast du dir den gesamten Code oben selbst ausgedacht oder war z.B. das Einlesen Teil der Aufgabenvorlage? Wenn du dir das alles selbst ausgedacht hast würde ich dir empfehlen den Code auf "C++" abzuändern, so hast du eher C in einer C++ Datei geschrieben. Heißt: Verwende std::string statt char Arrays. Verwende std::cout und std::cin statt printf und fgets. Verwende std::reverse zum Umdrehen und string::erease zum Löschen der Whietspaces. Und letzter Tipp: Verwende keine deutschen Variablennamen, wir sind nicht mehr in den 90ern. Es kommt halt drauf an: Willst du etwas über Arrays lernen? Dann lass den Code mit Arrays. Möchtest du stattdessen C++ Programmierung lernen? Dann beachte meine die editierte Antwort von mir.Ich habe dir mal den "reinen C++ Weg" geschrieben.
─
vetox
07.06.2024 um 19:14
Markdown wird unterstützt.