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"); } }
3 Antworten
![](https://images.gutefrage.net/media/user/tavkomann/1546901653590_nmmslarge__0_0_512_512_d0d8c4156c0806032a429d80fed1cb83.png?v=1546901654000)
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
![](https://images.gutefrage.net/media/user/regex9/1455660989427_nmmslarge__0_13_270_270_615d5a3bc6888f4c1486ce2b4d9d8f60.png?v=1455660989000)
Zuerst einmal zu deinem Code:
- Bitte stelle Code hier formatiert hinein. Der GF-Editor hat eine Code-Funktion, mit der geht das ganz einfach und potenzielle Antwortgeber können dir auch einfacher helfen. Im Notfall gibt es noch Dienste wie pastebin.com oder hastebin.com.
- Gib Variablennamen immer einen aussagekräftigen, eindeutigen Namen.
- In C mag das zwar eine Eigenheit für sich sein, aber es ist besser, Variablen erst dann zu deklarieren, wenn sie wirklich gebraucht werden. Es spart an Code-Zeilen und macht den Code übersichtlicher. Bei einer langen Funktion müsstest du sonst ständig hoch und runterscrollen, nur um zu schauen, wo und wie die Variable deklariert wurde.
- Vor allem als Anfänger solltest du stets die geschweiften Klammern um Code-Blöcke setzen, ob sie nun nur eine Anweisung beinhalten oder nicht.
Zu deinem Problem:
Zum Umwandeln von Zeichen in Kleinbuchstaben gibt es die Funktion toLower:
http://www.cplusplus.com/reference/cctype/tolower/
Du schaust nicht wirklich, ob sich alle Buchstaben spiegeln. Dabei müsstest du doch lediglich mit einer Schleife prüfen, ob es stets gleiche Zeichenpaare gibt.
Pseudocode:
char letters[] = /* ... */;
for i = 0, j = wordlength - 1; i < wordlength / 2; ++i, --j
if toLower(letters[i]) != toLower(letters[j])
return 0
return 1
Wenn das Wort nur einen einzigen Buchstaben beinhaltet, kannst du dir die Schleife sparen und gleich ein positives Ergebnis zurückgeben.
![](https://images.gutefrage.net/media/user/ralphdieter/1444750340_nmmslarge.jpg?v=1444750340000)
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.