Zeichenketten vergleichen
-
Hi Leute!
Ich soll ein Programm schreiben, dass Zeichenketten miteinander vergleicht. Wir sollen damit Zeichenketten wie z.B. Wörter vergleichen, die von vorne und von hinten gelesen das Gleiche ergeben.
Hier mal mein Code:
#include<stdio.h> #include<string.h> int main() { char palindrom[6], ruckwartswort[6]; int pal_size, i, j; printf("Palindrom eingeben: "); scanf("%s", palindrom); //Eingabe der Zeichenkette pal_size = strlen(palindrom); //Größe der Zeichenkette j = 0; for(i=(pal_size-1); i>=0; i=i-1) { ruckwartswort[j] = palindrom[i]; j = j + 1; } printf("Laenge des Strings: %i \n", pal_size); printf("Palindrom Rueckwaerts: %s \n", ruckwartswort); if(strcmp(ruckwartswort, palindrom) == 0) //Vergleich der beiden Zeichenketten { printf("Ja, ist ein Palindrom!\n"); } else { printf("Nein, ist KEIN Palindrom!\n"); } return 0; }
Jetzt hab ich noch ein Problem, nämliche, dass das eingegebene Wort am Ende die 0-Terminierung verwendet. Wenn ich es nun von hinten anfangend in das array ruckwartswort schreiben möchte, beginne ich durch den Zähle "pal_size-1" genau eine Stelle im array vor dieser 0-Terminierung. Wenn ich als Zähler nur "pal_size" verwende, dann bekomm ich die 0-Terminierung ja leider an der ersten Stelle. Das wäre dann genauso ein Grund, dass mir die if-Abfrage am Schluss die beiden Zeichenketten immer als "falsch" bewertet. Meine Frage bei der ich einfach nicht mehr weiterkomme: Wie bekomm ich das jetzt hin, dass an der richtigen Stelle im array ruckwartswort die 0-Terminierung steht?
Könnt ihr mir helfen?
-
int is_palin(const char *msg, int len) { int i, j; for (i = 0, j = len; i < j; i++, j--) // <= würde auch gehen ;) { if (msg[i] != msg[j]) { return 0; } } return 1; }
Wenn du was nicht verstehst, frag einfach
Edit:
Aufruf zB. mit:int main() { char buffer[0x100]; fgets(buffer, sizeof(buffer), stdin); buffer[strlen(buffer) - 1] = 0; if (is_palin(buffer, strlen(buffer))) { printf("Zeichenkette ist ein Palindrom!\n"); } else { printf("Zeichenkette ist kein Palindrom!\n"); } return 0; }
scanf() sollte so nicht genutzt werden da es zu Pufferüberläufen kommen kann.
Wenn schon dann so:#define BUFFER_SIZE 256 scanf("%255s", buffer);
Edit 2: return Werte vertauscht & const.. ist schon spät..
-
Ähm, ja...
Ich hab jetzt mal meinen Code so verändert:
j = 0; for(i=(pal_size-1); i>=0; i=i-1) { ruckwartswort[j] = palindrom[i]; j = j + 1; } ruckwartswort[pal_size] = palindrom[pal_size];
Der tut das jetzt soweit auch.
Mich würde aber trotzdem gerne interessieren was du da gemacht hast... Deckt dein Code eigentlich auch den Fall für "Anna" ab? Das wäre ja von hinten gelesen "annA" was für das Programm sicher nicht das Gleiche ist, für uns Menschen (laut Aufgabe) aber das Gleich sein soll...
Ich hab dafür die Funktion tolower(). Ich weiß nur nicht an welcher Stelle ich da jetzt bei mir ansetzen soll...
Danke!
-
Edit vom edit: Ich hätte es einfach stehen lassen sollen
int is_palin(const char *msg, int len) { if(len<=1) return 0; int i, j; for (i = 0, j = len-1; i < j; i++, j--) { if (msg[i] != msg[j]) { return 0; } } return 1; }
-
@ViciousFalcon: Ich verstehe nicht was du mir mit deinem letzten Beitrag sagen willst...
Ich soll den char als const char deklarieren? Was aber meinst du mit dem "*"?
Was meinst du mit "... Returnwerte sollten vertauscht werden."?Sprich: Ich komme mit eurem Beispiel nicht zurecht...
Vielleicht könnt ihr mir einfach ein bisschen draufhelfen und mit mir meinen Code soweit verbessern, dass ich als Erstsemester auch noch mitkomme...
-
int lower(char *msg, int len) { int i; for (i = 0; i < len; i++) { msg[i] |= 0x20; } }
Einfach vor is_palin() aufrufen.
-
bandchef schrieb:
@ViciousFalcon: Ich verstehe nicht was du mir mit deinem letzten Beitrag sagen willst...
Ich soll den char als const char deklarieren? Was aber meinst du mit dem "*"?
Was meinst du mit "... Returnwerte sollten vertauscht werden."?Sprich: Ich komme mit eurem Beispiel nicht zurecht...
Vielleicht könnt ihr mir einfach ein bisschen draufhelfen und mit mir meinen Code soweit verbessern, dass ich als Erstsemester auch noch mitkomme...
1. Der Parameter ist als const deklariert damit man auch konstante Werte ohne gefrickel übergeben kann. Ansonsten wäre sowas nicht möglich:
is_palin("anna", strlen("anna"));
2. Die Idee hinter der Funktion kann man so am besten darstellen:
ANNA
Frage:
[A]NN[A]
gleich? ja -> i > j? nein -> also weiter
A[N][N]A
gleich? ja -> i > j? nein -> also weiter
A[N][N]A
gleich? ja -> i > j? ja -> ist Palindrom3. Die lower() Funktion.. naja Stichworte:
"Binäre Operatoren"
http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange
http://www.c-plusplus.net/forum/276587Das wärs glaube ich^^
-
Mit const meinte ich, dass die Funktion einen const char* erwarten sollte. Die Funktion darf die Zeichenkette nämlich nicht verändern.
Wenn du dennoch Groß-/Kleinschreibubung ignorieren möchtest, dann nutze die Funktion tolower aus ctype.h.
.. #include <ctype.h> int is_palin(const char *msg, int len) { int i, j; if(len<=1) return 0; for (i = 0, j = len-1; i <= j; ++i, --j) if (tolower(msg[i]) != tolower(msg[j])) return 0; return 1; } int main() { const char* p = "Reliefpfeiler"; printf("%d",is_palin(p,strlen(p))); return 0; }
Edit: Wenn ich "darf" fett schreibe, sollte ich das mit "nicht" auch tun.
-
Anmerkung zum ersten Post:
j = 0; for(i=(pal_size-1); i>=0; i=i-1) { ruckwartswort[j] = palindrom[i]; j = j + 1; } ruckwartswort[j] = 0; // Hier wird die 0 drangehaengt. printf("Laenge des Strings: %i \n", pal_size); printf("Palindrom Rueckwaerts: %s \n", ruckwartswort);
Allerdings sind 5 Zeichen arg wenig.