C Wort ohne leerzeichen und groß/kleinschreibung einlesen

ReVo

Lieutenant
Registriert
Jan. 2006
Beiträge
567
Hallo,

ich habe ein programmchen wo ich wörter oder sätze prüfe ob die Palindrom sind oder nicht. Also mit wörtern wo alles kleingeschrieben wird und wo natürlich keine leerzeichen vorkommen klappt alles. Aber wenn man mal leerzeichen reinsetzt oder die hälfte groß die andere hälfte klein schreibt, geht das nicht. Deswegen wollte ich mal fragen wie man die leerzeichen einfach ignorieren lässt bzw. ob jetzt alles groß oder kleingeschrieben wurde.

Hier übrigens mein code, falls das jemand sehen - erweitern mag ;)

Code:
#include <stdio.h>

int main(){

 	char text[] = "abcddcba";       /* Wort/Satz was geprüft werden soll */
	int counter = 0;
	int laenge = 0;
	int i = 0;

	laenge = sizeof(text);

	while(counter < (laenge / 2)) {

		if(text[counter] == text[laenge - counter - 2])
		{
			i = i + 1;
		}
		counter++;
	} 

	laenge--;
	if(laenge/2 == i) 
	printf("Das war ein Palidrom! ;) \n");
	else
	printf("Das war KEIN Palidrom! :( \n");

return 0;
}

Danke schonmal & Gruß
 
Na ja, du könntest alle Buchstaben darauf überprüfen, ob sie großbuchstaben sind, also im Zahlenbereich der ASCII-Tabelle zwischen 65 und 90 liegen. Wenn das der Fall ist, lässt du einfach 32 abziehen und schon hast du den selben Buchstaben nur klein.
Alternativ kannst du auch die Funktion tolower() aus ctype.h verwenden, diese wandelt einen Großbuchstaben in einen Kleinbuchstaben um.
Ähnlich lässt sich das Problem mit dem Leerzeichen lösen, bau doch einfach noch eine Abfrage ein, ob das aktuelle zeichen die Nummer 32 hat, also ein Leerzeichen ist. Wenn das der Fall ist, einfach beim nächsten Zeichen weitermachen.
http://www.cppreference.com/wiki/ascii
Das ganze geht, weil char-variablen an sich integerwerte sind^^
 
Zuletzt bearbeitet:
Die Kleinbuchstaben stehen in der ASCII-Tabelle weiter hinten, deswegen: nicht 32 abziehen sondern 32 aufaddieren ;)

Im Großen und Ganzen muss hier nach der ASCII-Tabelle gearbeitet werden.
 
Ganz schön aufwendig ^^ , danke ich mache mich mal ran

Gruß
 
Die Funktion isalpha() dürfte ganz hilfreich sein.

Am einfachsten kannst du das Überspringen von Leerzeichen (und allen anderen Zeichen für die isalpha() false zurückliefert) vermutlich dadurch erreichen, dass du mit zwei Zeigern (einmal von links und einmal von rechts) über den string gehst.
Diese Zeiger verschiebst du einfach so lange bis isalpha() true zurückliefert. Die beiden gefundenen Stellen testest du dann mit tolower() auf Gleichheit. Wenn sie ungleich sind ist es kein Palindrom. Ansonsten wiederholst du das ganze so lange bis die Zeiger sich überkreuzen bzw. über das Ende des strings hinausgehen. Klingt vielleicht etwas kompliziert, aber dafür sparst du dir die Erstellung einer Kopie ohne Leerzeichen.

Übrigens solltest du anstelle von
PHP:
laenge = sizeof(text);
besser
PHP:
laenge = strlen(text);
verwenden. Funktioniert hier zwar beides, aber spätestes wenn die Länge des strings beim Komilieren noch nicht feststeht wird dir sizeof nicht den gewünschten Wert zurückliefern.
 
C hat ja verdammt wenige Funktionen für Strings. Ansonsten bräuchte man nur alle Leerzeichen mit StringReplace ersetzen, den String mit toLower in Kleinbuchstaben umwandeln und prüfen ob StringReverse (Umkehrstring) genauso aussieht. In neueren Sprachen wäre das eine Zeile mit 3 Funktionen.
Die Funktion toLower kannst du jedenfalls vor der ganzen Überprüfung anwenden, so daß du mit Sicherheit nur Kleinbuchstaben hast.
 
Zurück
Oben