Palindrom in C erkennen
-
habs geändert, nun spuckt er gar nichts mehr aus.
hier noch eine andere variante.. das geht auch nicht.. er sagt immer kein palindrom.#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char string[30], string2[30]; int i, j=0; printf("Bitte geben Sie ein Wort ein, das Pr. ueberprueft, ob es sich um ein Palindrom handelt:\n"); fgets(string, 30, stdin); i = strlen(string); for(;i>=0;i--, j++){ string2[j]=string[i]; } if (string2==string) printf ("Palindrom"); else printf("Kein Palindrom"); return 0; }
-
vfbf4n1893 schrieb:
if (string2==string) printf ("Palindrom");
Weißt du überhaupt, was du da vergleichst? Wohl nicht, also sag ichs einfach mal.
Du vergleichst die Adressen von von string2 und string, diese sind aber unterschiedlich, egal was im string selber steht.cstring sind nicht die gleichen strings, die du vllt aus java oder php oder sonst woher kennst.
Schau dir mal strncmp an, damit kannst du strings vergleichen.
gruß akoww
-
Ach ja, du hast da ja fgets.
fgets speichert das '\n' von der Enter-Taste mit ab.Wenn du mal nach dem fgets ein
printf("<%s>\n", string);
machst, wirst du sehen, das da dann so etwas wie
<OTTO >
steht. Am > in der neuen Zeile kannst du sehen, dass zwischen OTTO und dem > ein '\n' steht.
Und den Rest hat aquaman geschrieben.
-
habe nun das fgets weggemacht und die strncmp vergleichsfunktion eingebaut. leider spuckt er nun gar nichts aus.
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char string[30], string2[30]; int i=0, j=0; printf("Bitte geben Sie ein Wort ein, das Pr. ueberprueft, ob es sich um ein Palindrom handelt:\n"); scanf("%c", &string); while (string[i] != '\0'){ i++; } for(;i>=0;i--, j++){ string2[j]=string[i]; } if (strcmp(string,string2) == 0) {printf ("Palindrom");} else {printf("Kein Palindrom");} return 0; }
-
scanf("%c", &string);
Nimm das & weg. Damit versuchst du den Adressoperator noch einmal auf eine Adresse anzuwenden.
edit:
Mit %c liest du nur 1 character. Mit %s kannst du einen string lesen
edit2:
while ( string[i] ) i++; // so ist es sauberer , '\0' ist das gleiche wie 0
-
Dann schau nochmal nach was bei scanf mit %c eingelesen wird.
scanf erwartet auch eine Adresse wo es Daten abspeichern kann. Genau wie fgets auch.
Nur da hast du kein Adressoperator eingesetzt.Den brauchst du bei Arrays nicht. Da steht der Name schon für die Adresse.
-
ach ok, hab das geändert in %s und das & weggemacht. leider sagt er immer noch jedes mal das es kein palindrom ist, egal was ich eingebe.
-
Dann gib doch mal die beiden Strings aus. (Bsp. s.o)
Evtl sind sie ja wirklich unterschiedlich.
Möglicherweise kopierst du zu viel Zeichen beim Umdrehen.Mach mal bei der Umkehrschleife:
for(;i>=0;i--, j++){ string2[j]=string[i]; printf("Zeichen bei %d|%d: %c, Wert: %d \n", i, j, string2[j], string[i]); } printf("Vergleiche <%s> mit <%s>\n", string, string2);
-
#include <ctype.h> #include <string.h> #include <stdio.h> int is_palindrome( char const *beg, char const *end ) { if( !( beg && end ) ) return 0; --end; if( !*end || !isprint( *end ) ) --end; while( beg < end ) if( *beg++ != *end-- ) return 0; return 1; } int main() { char const *text = "abcba"; printf( "\"%s\" %s a palindrome.", text, is_palindrome( text, text + strlen( text ) + 1 ) ? "is" : "isn't" ); }
-
mm ok, kommt folgendes raus:
Bitte geben Sie ein Wort ein, das Pr. ueberprueft, ob es sich um ein Palindrom h
andelt:
otto
Zeichen bei 4|0: , Wert: 0
Zeichen bei 3|1: o, Wert: 111
Zeichen bei 2|2: t, Wert: 116
Zeichen bei 1|3: t, Wert: 116
Zeichen bei 0|4: o, Wert: 111
Vergleiche <otto> mit <>
Kein Palindrom
Process returned 0 (0x0) execution time : 1.547 s
Press any key to continue.er gleicht unten otto mit gar nichts, wieso das?
-
Das erste Zeichen das du kopierst, hat den Wert 0 (oder '\0') und ist an der Position 4.
Wo kommt das her? und warum Position 4?Du hast:
while (string[i] != '\0'){ i++; }
Welchen Wert hat i, wenn du auf die '\0' triffst?
-
vfbf4n1893 du hast mit deiner schleife übrigens ein wert zu viel kopiert, die '\0' brauchst du nicht.
for( ; i > 0; i--, j++) string2[j]=string[i];
-
akoww schrieb:
vfbf4n1893 du hast mit deiner schleife übrigens ein wert zu viel kopiert, die '\0' brauchst du nicht.
Doch, die '\0' braucht er. Aber an einer anderen Stelle.
akoww schrieb:
for( ; i > 0; i--, j++) string2[j]=string[i];
Damit kopierst du aber auch die '\0' (Die steht an Stelle string[i] beim ersten Durchlauf)
-
vfbf4n1893 schrieb:
ach ok, hab das geändert in %s und das & weggemacht. leider sagt er immer noch jedes mal das es kein palindrom ist, egal was ich eingebe.
Noch zwei Fehler:
- Die Anzahl der Zeichen in string ist nicht der letzte Index in der Zeichenkette string. Füg mal hinter die While-Schleife noch ein
i--;
ein.
- string2 hat noch keine Abschlussnull. Füg mal hinter die For-Schleife noch ein
string2[j]=0;
ein.
viele grüße
ralph
-
ok das wars, nun geht es... das 1. ist mir klar. i war um 1 zu hoch.
kannst du das 2. nochmal genau erkläre, was macht genau das =0?rkhb schrieb:
vfbf4n1893 schrieb:
ach ok, hab das geändert in %s und das & weggemacht. leider sagt er immer noch jedes mal das es kein palindrom ist, egal was ich eingebe.
Noch zwei Fehler:
- Die Anzahl der Zeichen in string ist nicht der letzte Index in der Zeichenkette string. Füg mal hinter die While-Schleife noch ein
i--;
ein.
- string2 hat noch keine Abschlussnull. Füg mal hinter die For-Schleife noch ein
string2[j]=0;
ein.
viele grüße
ralph
-
Weißt du wofür die '\0' (oder 0) in einem String da ist?
-
das ist immer das letzte zeichen im string, das weiß ich. jedoch weiß ich nicht, was der befehl soll string2[j]=0;
-
vfbf4n1893 schrieb:
das ist immer das letzte zeichen im string, das weiß ich. jedoch weiß ich nicht, was der befehl soll string2[j]=0;
Welchen Wert hat denn j am Ende der for-Schleife?
-
vfbf4n1893 schrieb:
kannst du das 2. nochmal genau erkläre, was macht genau das =0?
rkhb schrieb:
...
2) string2 hat noch keine Abschlussnull. Füg mal hinter die For-Schleife noch einstring2[j]=0;
ein.
Ein C-String besteht nicht nur aus den Buchstaben, sondern zusätzlich noch aus einer Null hintendran. Damit weiß man, wo der String zu Ende ist. Ein Wort aus 5 Buchstaben benötigt also ein Zeichenkettenarray mit (mindestens) 6 chars. Bei Deinem Programm zeigt j nach Beendigung der For-Schleife auf das Byte hinter den Buchstaben. Genau dort gehört eine Null hin und genau dorthin wird eine Null gespeichert.
viele grüße
ralph
-
4?, ach da sagst du dem string, dass er hier fertig ist. ansonsten kommen irgendwelche werte da hin?