Palindrom mit C-Programmieren überprüfen?
Ich habe eine Aufgabe bekommen, wo ich mit einem C-Code überprüfen muss, ob das Wort oder ein Satz ein Palindrom ist. Ich habe folgendes ausprobiert, aber da sind paar Fehler drin, ich komm nicht weiter:
#include <stdio.h> #include <string.h> int main (){ char text[255]; int len =0; int i; int j; int z; char neu; printf("Bitte text eingeben"); fgets(text, 255, stdin); len = strlen(text); for (i=0; i != len; i++) if (text[i] >= 'A' && text[i] <= 'Z'){ text[i] += 32; } for (j = len; j >= 0; j--) printf("%c",text[j]); printf("\n"); if (text[j] == text[i]) { printf("palindrom"); } else { printf("kein palindrom"); } }
2 Antworten
Hallo stevke94,
willkommen bei gutefrage! Zunächst einmal bitte ich dich, bei zukünftigen Fragen für Code die Code-Tags zu benutzen, damit man deinen Code besser lesen kann. Dieses Mal habe ich es für dich korrigiert.
Dein Code enthält folgende Fehler:
- Fehlende/falsche Klammern bei for-Schleifen
- Die Semantik des Codes ist falsch (="er tut nicht das, was er soll"); wo überprüfst du, ob es ein Palindrom ist?
- Weitere Kleinigkeiten
Folgende Verbesserungsvorschläge habe ich zusätzlich:
- Fasse Deklaration und Initialisierung zusammen, sofern möglich
- Rücke deinen Code korrekt ein und vermeide redundante Leerzeilen
- Fasse Deklarationen für Variablen gleichen Datentyps der Übersichtlichkeit halber zusammen
- Die Deklaration von Variablen innerhalb einer for-Schleife ist in C mittlerweile möglich und sollte auch zur besseren Lesbarkeit angewandt werden
- Die Umwandlung in Kleinbuchstaben muss nicht so kompliziert erfolgen, sondern dafür kann auch die Funktion tolower verwendet werden
- Verwende Funktionen, anstatt alles in die main-Funktion zu schreiben
Es ergibt sich somit bei weitestgehender Beibehaltung deines Codes:
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main() {
char text[255];
bool isPalindrome = true;
printf("Bitte text eingeben:");
scanf("%s", text);
int len = strlen(text);
for (int i = 0; i < len; ++i) {
if (text[i] >= 'A' && text[i] <= 'Z') {
text[i] += 32;
}
}
for (int i = 0; i < len/2; ++i) {
if (text[i] != text[len - i - 1]) {
isPalindrome = false;
break;
}
}
if (isPalindrome) {
printf("Das Wort ist ein Palindrom!");
} else {
printf("Das Wort ist kein Palindrom!");
}
}
Oder etwas übersichtlicher:
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
bool checkPalindrome(char text[]) {
int len = strlen(text);
for (int i = 0; i < len/2; ++i) {
if (tolower(text[i]) != tolower(text[len - i - 1])) {
return false;
}
}
return true;
}
int main() {
char text[255];
printf("Bitte text eingeben:");
scanf("%s", text);
if (checkPalindrome(text)) {
printf("Das Wort ist ein Palindrom!");
} else {
printf("Das Wort ist kein Palindrom!");
}
}
Viele Grüße
tavkomann
Kritik zu Deinem Programmierstil gab's ja schon genug. Deshalb zeige ich nur mal, wie ich die Aufgabe lösen würde. Das kannst Du dann mit Deiner Lösung vergleichen.
#include <locale.h> // setlocale()
#include <stdlib.h> // mbstowcs()
#include <string.h> // strlen()
#include <wchar.h> // wprintf()
#include <wctype.h> // iswalnum() ...
int palindrom ( wchar_t const *s, wchar_t const *t )
{
while (s<t && !iswalnum(*s)) ++s; // Sonderzeichen
while (s<t && !iswalnum(*t)) --t; // überspringen.
return s >= t // 0 oder 1 Zeichen sind immer ok.
|| ( towlower(*s)==towlower(*t)
&& palindrom(s+1, t-1) );
}
int main ( int argc, char const * const argv[] )
{
if (argc != 2) {
wprintf( L"Usage: %s <text>", argv[0] );
return 2;
}
setlocale( LC_ALL, "" );
wchar_t text[strlen(argv[1])];
mbstowcs( text, argv[1], sizeof text );
int test = palindrom( text, text+wcslen(text) );
wprintf( L"«%ls» ist %s Palindrom."
, text, test ? "ein" : "KEIN" );
return !test;
}
Die Ausgabe sieht dann so aus:
$ gcc -Wall -o palindrom palindrom.c
$ ./palindrom "Eine güldne, gute Tugend: Lüge nie!"
«Eine güldne, gute Tugend: Lüge nie!» ist ein Palindrom.