Palindrom in C erkennen



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



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

    string2[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?



  • Genau.

    Die Erklärung hat schon rkhb geschrieben.


Anmelden zum Antworten