Palindrom mit C-Programmieren überprüfen?

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.