C++ Palindrome erzeugen

Aufrufe: 87     Aktiv: 07.06.2024 um 20:34

0

Hey, ich muss ein Programm in c++ schreiben, wo ich einen Text umgekehrt erzeugen muss, also dass der letzte Buchstabe an die erste Stelle tritt, der vorletzte an die zweite usw. um anschließend zu prüfen ob es sich um ein Palindrom handelt. Es hängt allerdings noch bei Teil 1, da der Text nicht umgekehrt ausgespuckt wird. Kann jemand sagen wo es im Programm hakt?

define _CRT_SECURE_NO_WARNINGS

include

include

int main() {       char text[30];       int pos;       char umgekehrt[30];

printf("Text eingeben:");       fgets(text, sizeof(text), stdin);       pos = strlen(text);       text[pos - 1] = 0;

char c;       for (int i = 0; i < pos; i++)       {             c = text[pos - 1 - i];             umgekehrt[i] = c;       }

printf("Text umgekehrt: %s",text); }

Diese Frage melden
gefragt

Punkte: 10

 
Kommentar schreiben
1 Antwort
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
geantwortet

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

Kommentar schreiben