Funktion mit Zeiger - Problem



  • Hi!

    Ich habe hier folgendes Problem: Ich lese aus einer Datei, in der ein Text steht, die Wörter einzeln heraus und speichere sie in wort ab. Nun möchte ich ein einzelnes Wort anzeigen lassen und dieses gegebenenfalls abändern.

    In diesem Programm funktioniert das reibungslos.

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #define OEFFNEN fp=fopen("datei.txt", "r");
    #define SCHLIESSEN fclose(fp);
    
    char neu[20];
    
    void tausch(char* zeiger)
    {
        strcpy(zeiger, neu);
    }
    
    main()
    {
    FILE *fp;
    char wort[500][30], answ[2];
    int i=0, j;
    
    OEFFNEN             //Wörter zählen
    while(!feof(fp))
    {
    fscanf(fp, "%s", &wort[0]);
    i++;
    }
    SCHLIESSEN
    
    OEFFNEN             //Wörter jeweils abspeichern
    while (!feof(fp))
    {
    for (j=0; j<i; j++)
        {
        fscanf(fp, "%s", &wort[j]);
        }
    }
    SCHLIESSEN
    
    printf("Der Text enthaelt %d Woerter.\n\n", i);       //Wörter abfragen
    
    for (j=0; j<i; j++)
    {
        printf("Wort %3d: %s\n", j+1, wort[j]);
    }
    
    printf("\nDas wievielte Wort soll angezeigt werden? ");
    scanf("%d", &j);
    printf("Das %d. Wort lautet: '%s'\n", j, wort[j-1]);
    printf("Moechten Sie dieses aendern? ");
    scanf("%s", &answ);
    
    if (strcmp(answ, "J")==0 || strcmp(answ, "j")==0)
    {
    printf("Wie soll das neue Wort heissen? ");
    scanf("%s", &neu);
    tausch(&wort[j-1]);
    }
    
    for (j=0; j<i; j++)
    {
        printf("Wort %3d: %s\n", j+1, wort[j]);
    }
    
    getch();
    }
    

    Wenn ich jedoch in die Funktion tausch() die printf- und scanf-Zeile übernehme und im Hauptprogramm dafür weglasse, funktioniert dies nicht mehr.

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #define OEFFNEN fp=fopen("datei.txt", "r");
    #define SCHLIESSEN fclose(fp);
    
    char neu[20];
    
    void tausch(char* zeiger);
    
    main()
    {
    FILE *fp;
    char wort[500][30], answ[2];
    int i=0, j;
    
    OEFFNEN             //Wörter zählen
    
    while(!feof(fp))
    { 
    fscanf(fp, "%s", &wort[0]);
    i++;
    } 
    SCHLIESSEN
    
    OEFFNEN             //Wörter jeweils abspeichern
    while (!feof(fp))
    {
    for (j=0; j<i; j++)
        {
        fscanf(fp, "%s", &wort[j]);
        }
    }
    SCHLIESSEN
    
    printf("Der Text enthaelt %d Woerter.\n\n", i);       //Wörter abfragen
    
    for (j=0; j<i; j++)
    {
        printf("Wort %3d: %s\n", j+1, wort[j]);
    }
    
    printf("\nDas wievielte Wort soll angezeigt werden? ");
    scanf("%d", &j);
    printf("Das %d. Wort lautet: '%s'\n", j, wort[j-1]);
    printf("Moechten Sie dieses aendern? ");
    scanf("%s", &answ);
    
    if (strcmp(answ, "J")==0 || strcmp(answ, "j")==0)
    {
    tausch(&wort[j-1]);
    }
    
    for (j=0; j<i; j++)
    {
        printf("Wort %3d: %s\n", j+1, wort[j]);
    }
    
    getch();
    }
    
    void tausch(char* zeiger)
    {
        printf("Wie soll das neue Wort heissen? ");
        scanf("%s", neu);
        strcpy(zeiger, neu);
    }
    

    Dafür bekomme ich die Fehlermeldung, dass das Argument in dem Programmaufruf

    tausch(&wort[j-1]);
    

    nicht stimmt.

    Wieso?

    MfG



  • tausch() erwartet einen Zeiger auf char.
    Du übergibst tausch() aber einen Zeiger auf einen Zeiger auf char.

    Lösung:

    Lass das & vor wort[j-1] weg, denn wort[j-1] allein ist schon ein Zeiger auf char.

    Mal davon abgesehen würde ich die Kombination & und [] sowieso nicht verwenden. Erst willst du einen Wert auf den eine Adresse zeigt und dann willst du wieder nur die Adresse davon.



  • Neuling2000 schrieb:

    Wenn ich jedoch in die Funktion tausch() die printf- und scanf-Zeile übernehme und im Hauptprogramm dafür weglasse, funktioniert dies nicht mehr.

    Bitte immer Minimalbeispiele machen, dann werden deine Beiträge kürzer und die Lust, sie zu beantworten steigt signifikant an.

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    #define OEFFNEN fp=fopen("datei.txt", "r");
    #define SCHLIESSEN fclose(fp);
    

    Sowas ist häßlich.

    main()
    

    int main()

    while(!feof(fp))
    { 
    fscanf(fp, "%s", &wort[0]);
    i++;
    }
    

    http://www-info2.informatik.uni-wuerzburg.de/dclc-faq/kap11.htm (11.5 speziell, aber auch den Rest). Bitte feof nur verwenden, wenn man weiß, was man tut.

    Außerdem liest Du mit fscanf char* ein.
    Üblicher Anwendungsfall ist: "char *s = malloc(...); scanf("%s", s);"
    Also sollte das hier besser wort[0] statt &wort[0] heißen. Vermutlich macht das aber keine Probleme, aber es verwirrt.

    if (strcmp(answ, "J")==0 || strcmp(answ, "j")==0)
    {
    tausch(&wort[j-1]);
    }
    

    Du willst einen 'char*' übergeben, wort ist 'char [x][y]'. Also solltest Du "tausch(wort[j-1])" schreiben.

    Es gibt noch so andere Holprigkeiten im Programm (einlesen mit scanf ohne Längenprüfung o.ä.) aber für den Hausgebrauch mag das okay sein. Warum öffnesst Du die Datei denn zweimal? Du kannst auch einfach
    "while (fscanf(f, "%s", wort[i++]) != EOF);" oder so schreiben.


Log in to reply