Funktion zum Palindrom



  • Hallo

    Ich hab die Aufgabe ein Funktion zu schreiben, welche überprüft ob das eingegebene Wort ein Palindrom ist oder nicht.

    Nungut, ich bin blutiger Anfänger in C und habe mich daran versucht, schonmal vorher eine Frage gepostet aber ich versuchs selbst, stoße jedoch jetzt wieder an Hindernisse und brauch eure Hilfe.

    Meine Idee war, ein dynamisches Array im Funtkionskopf. Da ich nicht weiß wie lang das Wort ist.

    Als nächtes wollte ich die Länge des eingegebenen Wortes auslesen. in einer For - schleife die so lang ausgeführt wird, wie das Wort ist. So wollte ich jedes einzelne Zeichen rückwärts auslesen und wieder in einem anderen Array speichern.

    In einer nächsten Schleife könnte ich dann beide Arrays durchlaufen und hätte einmal ein Array wo das Wort von vorn nach hinten gelesen steht und einmal von hinten nach vorn. Da bei einem Palindrom das Wort von vorn, wie von hinten gleich ist, könnte ich das somit schön prüfen und eine booleansche Variable den wert true zurückgeben lassen.

    soweit komm ich schonmal nicht. (nebenher, gibts einen einfacheren Lösungsweg?)

    ich dachte dann, da der Array dynamisch ist geb ich auch dynamisch Speicher frei mit malloc. Leider bekomme ich haufen Fehlermeldeungen:

    x@host:~/code$:> gcc plai.c -o plai
    plai.c: In Funktion »Palindrom1«:
    plai.c:8: Fehler: »bool« nicht deklariert (erste Benutzung in dieser Funktion) <- Was muss ich da machen?
    plai.c:8: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal aufgeführt <- Warum, versteh ich nicht!
    plai.c:8: Fehler: für jede Funktion in der er auftritt.)
    plai.c:8: Fehler: expected »;« before »korrekt« <- Versteh ich auch nicht
    plai.c:9: Fehler: expected expression before »]« token <- Wie umgehe ich das?
    plai.c:9: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strlen« <- Wann ist es verträglich?
    plai.c:9: Fehler: expected »)« before »;« token <- Weiß leider nicht, wie ich das Syntaktisch richtig umsetzte
    plai.c:12: Fehler: expected »;« before »}« token <- Analog s.o
    

    Hier mein voerst fehlerhafter code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    
    Palindrom1(char *feld[]) {
      int i, l;
      bool korrekt; 
      feld[]=(char *) malloc(strlen(feld[]*sizeof(char)); //Dynamisch Speicher freigeben
      i = 1; l = strlen(feld[]);
     //Hier sollte dann der Code kommen fürs vergleichen....
    }
    int main(){
     return 0; // erstmal nur schauen ob die funktion oben stimmt, bevor ich hier weiter arbeite.
    }
    

    bin für sämtliche Hilfe dankbar!



  • In C gibts keine booleans

    mfg



  • 1.) in C gibt es seit C99 bool, allerdings heisst das Schlüsselwort _Bool , man muss die stdbool.h einbinden um bool verwenden zu können.
    2.) Ansonsten macht der Code einfach gar keinen Sinn.



  • Danke für 1.

    2. Der code macht jetzt noch keine sinn. Ich will nur bis dahin alle Fehler entfernen und dann weiterarbeiten. Und da einige hier Erfahrender sind als ich, brauch ich eure Hilfe! 🙂

    mfg



  • Hallo ich nochmal,

    Wie arbeitet man in C mit dynamischen Arrays?

    Mein Debugger kommt mit den "[ ]" klammern nicht zurecht in den Ausdrücken. Wie schreibt man sowas syntaktisch richtig?

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <stdbool.h>
    
    Palindrom1(char *feld[]) {
      int i, l;
      _Bool korrekt;
      feld[]=(char *) malloc(strlen(feld[])*sizeof(char));
      i = 1; l = strlen(feld[]);
    
    }
    int main(){
     return 0;
    }
    

    Fehlermeldung:

    plai.c:10: Fehler: expected expression before »]« token
    plai.c:10: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »strlen«
    plai.c:11: Fehler: expected expression before »]« token

    Und wie kann ich die länge eines dyn. Arrays auslesen?

    Vielen Dank!



  • Machs nicht so kompliziert. Den String extra nochmal umdrehen (inklusive Speicher reservieren) macht wenig Sinn. Stattdessen geh doch einfach in einer Schleife über den String drüber und vergleiche das erste Element mit den Letzten, das Zweite mit dem Vorletzten, etc...

    PS: stdbool.h einbinden aber trotzdem _Bool verwenden ist irgendwie albern 😉



  • hallo tim!

    danke dir 😉

    werd ich so machen ist besser.

    zum bool: ich dachte man muss stdbool einbinden um _bool zu verwenden? oder hab ich was falsch verstanden?



  • Soo habs mal weiter versucht zu basteln.

    Segmentation fault, sprich ne Schutzverletzung. In Wikipedia wird es erklärt, aber auf meinem code kann ich das nicht anwenden. also ich weiß nicht wo der genaue Fehler liegt?

    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <stdbool.h>
    
    Palindrom1(char *feld) {
       int i, n, l;
      _Bool korrekt;
    
      //Länge des Arrays berechnen
      l = sizeof(feld)/sizeof(int);
    
      //Speicherplatz freigeben
      feld=(char *) malloc(l*sizeof(char));
    
      //Leer? = Fehler.	
      if( NULL == (feld) ) {
          printf("Fehler bei Speicherfreigabe!\n");
          return EXIT_FAILURE;
       }
    
      while((i<l) && (korrekt=true)) 
       {
         if(feld[i]==feld[n])
    	{
     	return korrekt;
    	} else
     		{
     		 korrekt=false;
    		 return korrekt;
    		}
            n--;
     	i++;
       }
    
    free(feld);
    
    }
    
    int main(){
     char wort;
     printf("Geben Sie ein Wort ein:\n\n");
     scanf("%s",&wort);
    
     printf("Ergebnis:%s\n\n", Palindrom1(&wort));
     return 0;
    }
    

    Vielen dank!





    Palindrom1(char *feld) {
      l = sizeof(feld)/sizeof(int);
    ...,
    

    l ist immer 1 (auf x86 Rechnern), da feld ein Zeiger ist und sizeof(feld) stets 4 ist (auf x86 Rechnern).

    2. Thou shalt not cast malloc, yet you didst 😉

    while((i<l) && (korrekt=true))
    

    Du meinst eher

    while((i<l) && (korrekt==true))
    


  • so hab mal ne lösung gemacht.

    Aufruf ./programm "pallindrom zum testen"

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include <stdlib.h>
    
    int is_palindrom(char*);
    char* make_sentence(char**, int);
    
    int main(int argc, char **argv)
    {
        char* bla;
        bla= make_sentence(argv, argc);
        printf("ist \"%s\" ein palindrom? %d\n", bla, is_palindrom(bla) );
        printf("\nder satz lautet:\n%s\n",bla);
        return 0;
    }
    
    int is_palindrom(char *val)
    {
        int i, size;
        char* bla;
        size= strlen(val)-1;
        for(i=0;i<=size/2;i++)
        {
            if( toupper( (int)val[i] ) != toupper( (int)val[size-i]) )
            {
                return 0;
            }
        }
        return 1;
    }
    
    char* make_sentence(char** argv, int argc)
    {
        char *ret;
        int itmp=0, i,j,k=0;
        for(i=1;i<argc;i++)
        {
            itmp+=strlen(argv[i]);
        }
        itmp+=1;
        ret=(char*)malloc(itmp * sizeof(char));
    
        for(i=1;i<argc;i++)
        {
            for(j=0;j<strlen(argv[i]);j++)
            {
                if(isalpha((int)argv[i][j]))
                {
                    ret[k]=argv[i][j];
                    k++;
                }
            }
        }
        ret[k]='\0';
        return ret;
    }
    

Anmelden zum Antworten