Übergabe an Funktion ??



  • Hallo, nun bin ich wieder hier mit einem weiteren Problem.
    Ich habe ein Wörterbuch programmiert wobei das nicht weiter wichtig ist was ich programmiert habe, sondern ich möchte das jetzt etwas verschönern und zwar mit Funktionen. Nur scheitere ich bei diesem leider. Ich hoffe ihr könnt mir weiterhelfen.
    Das Programm funktioniert so wie es geschrieben ist, nur wenn ich es auf Funktionen ändern möchte nicht. Ich poste einmal nicht das ganze Programm, sondern nur den Abschnitt den ich behandeln möchte. (In diesem Abschnitt geht es eigenltich nur darum, alle Wörter, welche in einem anderen Abschnitt des Programms eingetragen worden sind, wieder auszugeben und zwar, entweder auf deutsch oder english.

    Das ist die Struktur:

    struct leo
    {
        char *deutsch;
        char *english;
    }*buch;
    

    So ist es wie ich es anfangs hatte:

    if(choice==3)
        {
            printf("Language(1 = Deutsch, 2 = English)"); scanf("%d", &which_language);
    
            if(which_language==1)
            {
                for(i=0;i<eintraege;i++)
                {
                    if(buch[i].deutsch != "--")
                    {
                        printf("%s, ", buch[i].deutsch);
                    }
                }
            }
    
            if(which_language==2)
            {
                for(i=0;i<eintraege;i++)
                {
                    if(buch[i].english != "--")
                    {
                        printf("%s, ", buch[i].english);
                    }
                }
            }
        }
    

    Und so dachte ich mir könnte ich es umschreiben:

    void look_word(struct leo *x, int entry ,int langu)
    {
        int i=0;
    
            printf("Language(1 = Deutsch, 2 = English)"); scanf("%d", &langu);
    
            if(langu==1)
            {
                for(i=0;i<entry ;i++)
                {
                    if(x[i].deutsch != "--")
                    {
                        printf("%s, ", x[i].deutsch);
                    }
                }
            }
    
            if(langu==2)
            {
                for(i=0;i<entry ;i++)
                {
                    if(x[i].english != "--")
                    {
                        printf("%s, ", x[i].english);
                    }
                }
            }
    }
    

    Und so wird diese Funnktion dann aufgerufen:

    if(choice==3)
            {
                look_word(buch, eintraege, which_language);
    
            }
    


  • Weder das eine noch das andere ist sinnvoll. Du hast nicht verstanden, wie man in C Strings vergleicht, absolutes Basiswissen!
    Strings vergleicht man in C mit der Standardbibliotheksfunktion strcmp also:

    if( strcmp(str1,str2) )
      puts("ungleich");
    else
      puts("gleich");
    


  • Tut mir leid ich versteh das nicht ganz. Das Programm selbst funktioniert so wie ich es möchte. Ich will ja keinen string vergleichen ich will nur diesen Abschnitt mit einer Funktion aufrufen können.



  • Trotzdem ist das falsch.
    Du sagst ja auch nicht was nicht funktioniert.

    Ein Fehler ist schon mal gefunden.



  • flo20 schrieb:

    Ich will ja keinen string vergleichen ich will nur diesen Abschnitt mit einer Funktion aufrufen können.

    if(buch[i].deutsch != "--")
    

    Tut mir leid für dich, aber du hast nicht nur einen Stringvergleich falsch durchgeführt, du weißt offensichtlich auch noch nicht mal, was ein String ist bzw. was du tust.
    Glaube mir, ich habe recht und du nicht.



  • ja der Teil bezieht sich auf diesen Abschnitt.

    if(choice==4)
        {
            printf("Language(1= Deutsch, 2 = English ) "); scanf("%d", &delete_word);
            if(delete_word==1)
            {
                printf("Welches Wort loeschen: "); scanf("%s", char_delete_word);
                for(i=0;i<eintraege;i++)
                {
                    if(strcmp(char_delete_word, buch[i].deutsch)==0)
                    {
                            buch[i].deutsch="--";
                            buch[i].english="--";
                            printf("Wort geloescht\n");
                    }
                }
            }
            if(delete_word==2)
            {
                printf("Which word delete: "); scanf("%s", char_delete_word);
                for(i=0;i<eintraege;i++)
                {
                    if(strcmp(char_delete_word, buch[i].english)==0)
                    {
                            buch[i].english="--";
                            buch[i].deutsch="--";
                            printf("word deleted\n");
                    }
                }
            }
        }
    

    Hier soll ein Wort quasi gelöscht werden und nicht ausgegeben werden. Ich weiss schon das ihr euch besser auskennt aber ich möchte ja dazulernen.

    Also es wenn ich das ganze Programm ausführen möchte mit der Funktion die ich geschrieben habe, überspringt es mir diesen Teil.
    Falls es noch Unklarheiten gibt werde ich das ganze Programm posten. Tut mir leid für für die Umstände.



  • if(strcmp(char_delete_word, buch[i].deutsch)==0)
                    {
                            buch[i].deutsch="--";
                            buch[i].english="--";
                            printf("Wort geloescht\n");
                    }
    

    Wenn ich das sehe, möchte ich mal sehen wie du die Wörter einträgst.



  • ok ich poste mal das ganze Programm.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct leo
    {
    char *deutsch;
    char *english;
    }*buch;
    
    void clear_buffer();
    
    int main()
    {
    int i, choice, eintraege=0, which_language, look_up_word, ausgetrickst=0, max_entries=2;
    int delete_word=0;
    char puffer[100];
    char char_look_up_word[100], char_delete_word[100];
    buch=malloc(sizeof(struct leo)*max_entries);
    if(buch==NULL)
    {
        printf("keine speicherallokierung moeglich\n");
    }
    printf("\nWelcome to PoorMansLEO\n\n");
    while(1)
    {
        printf("\n1... Add word\n");
        printf("2... Look up word\n");
        printf("3... List all words of a language\n");
        printf("4... Delete word\n");
        printf("5... Exit\n\n");
        printf("Choice:");
        scanf("%d", &choice);
        printf("\n");
    
        if(choice==1)
        {
            printf("\nDeutsch: "); scanf("%s", puffer);
            clear_buffer();
    
            for(i=0;i<eintraege;i++)
            {
                if(strcmp(puffer, buch[i].deutsch)==0)
                {
                    printf("Not added again\n");
                    ausgetrickst=1;
                }
            }
    
            if(ausgetrickst==0)
            {
                if(eintraege==(max_entries-1))
                {
                    max_entries*=2;
                    buch= realloc(buch, sizeof(struct leo)*max_entries);
                }
                buch[eintraege].deutsch=strdup(puffer);
                printf("English: "); scanf("%s", puffer);
                clear_buffer();
                buch[eintraege].english=strdup(puffer);
                eintraege++;
            }
        }
        ausgetrickst=0;
    
        if(choice==2)
        {
            printf("Language(1 = Deutsch, 2 = English) "); scanf("%d", &look_up_word);
    
            if(look_up_word==1)
            {
                printf("Welches Wort: "); scanf("%s", char_look_up_word);
    
                for(i=0;i<eintraege;i++)
                {
                    if(strcmp(char_look_up_word, buch[i].deutsch)==0)
                    {
                        printf("English: %s", buch[i].english);
                        ausgetrickst++;
                    }
                }
                for(i=0;i<eintraege;i++)
                {
                    if(ausgetrickst == 0 && !strcmp(buch[i].deutsch,"--"))
                    {
                            printf("Wort nicht gefunden\n");
                            break;
                    }
                }
                ausgetrickst=0;
            }
    
            if(look_up_word==2)
            {
                printf("Which word: "); scanf("%s", char_look_up_word);
    
                for(i=0;i<eintraege;i++)
                {
                    if(strcmp(char_look_up_word, buch[i].english)==0)
                    {
                        printf("Deutsch: %s", buch[i].deutsch);
                        ausgetrickst++;
                    }
                }
                for(i=0;i<eintraege;i++)
                {
                    if(ausgetrickst == 0 && !strcmp(buch[i].english,"--"))
                    {
                        printf("Word not found\n");
                        break;
                    }
                }
            }ausgetrickst=0;
    
        }
    
    if(choice==3)
    {
        printf("Language(1 = Deutsch, 2 = English)"); scanf("%d", &which_language);
    
        if(which_language==1)
        {
            for(i=0;i<eintraege;i++)
            {
                if(strcmp(buch[i].deutsch,"--"))
                {
                    printf("%s, ", buch[i].deutsch);
                }
            }
        }
    
        if(which_language==2)
        {
            for(i=0;i<eintraege;i++)
            {
                if(strcmp(buch[i].english,"--"))
                {
                    printf("%s, ", buch[i].english);
                }
            }
        }
    }
    if(choice==4)
    {
        printf("Language(1= Deutsch, 2 = English ) "); scanf("%d", &delete_word);
        if(delete_word==1)
        {
            printf("Welches Wort loeschen: "); scanf("%s", char_delete_word);
            for(i=0;i<eintraege;i++)
            {
                if(strcmp(char_delete_word, buch[i].deutsch)==0)
                {
                    buch[i].deutsch="--";
                    buch[i].english="--";
                    printf("Wort geloescht\n");
                }
            }
        }
        if(delete_word==2)
        {
        printf("Which word delete: "); scanf("%s", char_delete_word);
            for(i=0;i<eintraege;i++)
            {
                if(strcmp(char_delete_word, buch[i].english)==0)
                {
                    buch[i].english="--";
                    buch[i].deutsch="--";
                    printf("word deleted\n");
                }
            }
        }
    }
    if(choice==5)
    {
    free(buch);
    break;
    }
    
    }
    return 0;
    }
    
    void clear_buffer()
    {
    while(getchar() != '\n');
    }
    


  • Deine Stringbehandlung ist compilerabhängig, d.h. nur zufällig funktioniert sie solange dein Compiler Stringpooling für Literale verwendet, d.h. (liebe Kinder, nicht nachmachen!):

    char *s;
    
    s = "blafasel";
    if( s!="blafasel" ) /* Ungleichheitstest ist undefiniert, liefert meist true */
      puts("ungleich" );
    if( s=="blafasel" ) /* Gleichheitstest ist undefiniert, liefert nur bei eingeschaltetem Stringpooling true */
      puts("gleich");
    

    Alles ist gültiger C Code, aber undefiniertes Verhalten d.h. Schrott.



  • Mit dem free(buch); gibst du nur das frei, was du mit realloc angelegt hast. Der Speicher von strdup() bleibt weiterhin belegt.



  • ich danke einmal. muss mich nochmal in die ganzen bücher reinlesen.


Anmelden zum Antworten