Palindrom in C erkennen



  • ich soll ein programm schreiben, dass ein palindrom erkennt (ein wort, dass vorwärts und rückwärts gleich gelesen werden kann)

    kann mir jemand sagen, wieso das folgende nicht funktioniert?

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {   char string[30];
        int i=0, j=0;
    
        printf("Bitte geben Sie ein Wort ein, das Pr. ueberprueft, ob es sich um ein Palindrom handelt:\n");
        fgets(string, 30, stdin);
    
        while(string[j] != '\0'){
        j++;
        }
    
        while (j=0)     {
                         if (string[i]==string[j-1]) j-- && i++;
                         else printf("Das Wort ist KEIN Palindrom");break;
                        }
    
        if (j==0) printf("Das Wort ist ein Palindrom");
    
        return 0;
    }
    


  • Weil bei dem while eine Zuweisung steht = und keine Vergleich ==

    Da sollte auch der Compiler eine Warnung ausgeben.



  • 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:

    1. 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.

    1. 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:

    1. 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.

    1. 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?


Anmelden zum Antworten