Dieses Programm teilt einen String in Wörter auf (strtok), anschließend wird jeweils geprüft ob diese von vorn und von hinten gelesen gleich bleiben und somit Palindrome sind.
#include <stdio.h>
#include <string.h>
#define LENGTH 150
// Testdatensatz: "Ha/n/nah", "La-ger-regal", "O%t/to", "(Reit-)tier", "Reliefpfeiler", "Ren--tner", "R!o!t)or", "st--ets", "nein", "Hall67o" und "Lastwa$gen"
// Funktion: lengthOfString - die laenge von dem gegebenen String herausfinden
int lengthOfString(char wort[]) {
int i = 0;
// solang das Ende (\0) nicht erreicht ist, wird der Wert i um 1 erhöht
while (wort[i] != '\0') {
i++;
}
return i;
}
// Funktion: isPalindrom - prueft, ob der angegebe String ein Palindrom (lal, otto, lagerregal ...) ist
int isPalindrom(char wort[]) {
int i;
int length = lengthOfString(wort);
for (i=0; wort[i] != '\0'; i++) {
// for (i = 0; i <= (length-1); i++) { // Alternativ, solange keine Zeichen aus der Zeichenkette entfernt werden :-)
// vergleiche ersten und letzten, zweiten und vorletzten ...
if (wort[i] != wort[((length-1)-i)]) {
return 0;
}
}
return 1;
}
// Funktion: toLower - aus GROß wird klein -> ASCII-Tabelle anschauen ;-)
// Alternative-Funktion: tolower + ctype.h
int toLower(char wort[]) {
int i;
for (i=0; wort[i] != '\0'; i++) {
if (wort[i] <= 90 && wort[i] >= 65) {
wort[i] = wort[i]+32;
}
}
}
// Funktion: cleanString - entfernt '"' und ','
int cleanString(char wort[]) {
int i,j;
for (i=0, j=0; wort[i] != '\0'; i++) {
if (wort[i] != 34 && wort[i] != 44) {
wort[j++] = wort[i];
}
}
wort[j]='\0';
}
// Funktion: removeNonLetters - entfernt Sonderzeichen aus einem String
int removeNonLetters(char wort[]) {
int i,j;
int alphabet_small_num = 97;
int alphabet_big_num = 65;
for (i=0, j=0; wort[i] != '\0'; i++) {
while (alphabet_small_num <= 122) {
if (wort[i] == alphabet_small_num) {
wort[j++] = wort[i];
}
alphabet_small_num++;
}
while (alphabet_big_num <= 90) {
if (wort[i] == alphabet_big_num) {
wort[j++] = wort[i];
}
alphabet_big_num++;
}
alphabet_small_num = 97;
alphabet_big_num = 65;
}
wort[j]='\0';
}
/*
// Alternative-Funktion: removeNonLetters + ctype.h - entfernt Sonderzeichen aus einem String
int removeNonLetters(char wort[]) {
int i,j;
for (i=0, j=0; wort[i] != '\0'; i++) {
if (isalpha(wort[i])) {
wort[j++] = wort[i];
}
}
wort[j]='\0';
}
*/
// main - Hauptprogramm
int main(void) {
char zeichenkette[LENGTH];
char trennzeichen[] = " ";
char *wort;
printf("Bitte eine Zeichenkette eingeben: \n");
fgets(zeichenkette, sizeof(zeichenkette), stdin);
wort = strtok(zeichenkette, trennzeichen);
while(wort != NULL) {
cleanString(wort);
printf("\n\nOriginal: %s\n", wort);
if (isPalindrom(wort)) {
printf("Palindrom: %s\n", wort);
}
else {
printf("kein Palindrom: %s\n", wort);
}
removeNonLetters(wort);
printf("nach removeNonLetters: %s\n", wort);
if (isPalindrom(wort)) {
printf("Palindrom: %s\n", wort);
}
else {
printf("kein Palindrom: %s \n", wort);
}
toLower(wort);
printf("nach toLower: %s\n", wort);
if (isPalindrom(wort)) {
printf("Palindrom: %s \n", wort);
}
else {
printf("kein Palindrom: %s \n", wort);
}
printf("***********************************\n");
wort = strtok(NULL, trennzeichen);
}
return 0;
}
weitere hilfreiche Tipps findest du unter: de.wikibooks.org