Einzelne Wörter in Liste einlesen



  • Hallo,

    ich versuche mich gerade an einer Liste. Ich möchte ein Programm schreiben dass einzelne Wörter einliest und dann in einem Array speichert. Also quasi das dass Programm frägt wie viele Wörter ich eingeben mag, ich sage 5, und dann frägt es mich 5 mal und speichert jedes eingelesene Wort in dem array. Funktioniert so etwas überhaupt? Ich konnte im Netz leider nichts brauchbares finden und weiß nicht wirklich wie ich da ran gehen soll. Sämtliche Versuche mit Schleifen und scanf oder gets haben einfach nur Fehler geworfen.

    Hier mal mein Versuch:

    char Eingabe(){
        
        int anz = 0, i = 0, q = 0;
        printf("Geben Sie die Anz. der Wörter ein: "); scanf("%d", &anz);
    
        anz = q;
        char Wort[q];
        
        for (i=0;i<=anz;i++){
            printf("Wort %d: ", i+1); fgets(Wort[i], 19, stdin);
            
        return Wort;
        }
        
    }
    


  • Ein ´char` kann ein (einzelnes) Zeichen aufnehmen.

    char Wort[q];

    Ist ein Array und kann q Zeichen aufnehmen.
    So ein Array wird in C als String missbraucht. Dabei wird als Endekennung das Zeichen mit dem Wert 0 genommen ( -> Siehe ASCII), für das auch noch Platz sein muss.

    Wenn du als 5 Wörter speichern möchtest, brauchst du 5 Arrays oder ein 2D-Array oder etwas mit dynamischen Speicher (malloc und free)

    Der Compiler sollte bei deinem Beispiel reichlich Warnungen von sich geben, deren Erklärung auch Hinweise geben, warum es nicht funktioniert.


  • Mod

    Welchen Wert hat q in Zeile 6? Welchen Wert hat anz nach Zeile 6? Was soll q überhaupt sein?

    Funktioniert so etwas überhaupt?

    Computerprogramme können diese Aufgabe erfüllen, ja. Schwer zu glauben aber wahr.

    Ich konnte im Netz leider nichts brauchbares finden

    So so.



  • @SeppJ Q soll die Größe des Arrays bestimmen. Ja ich weiß dass es geht aber vielleicht suche ich auch falsch. Meine Frage war darauf bezogen ob so etwas mit arrays überhaupt geht, nicht generell.


  • Mod

    @ShrimpMan sagte in Einzelne Wörter in Liste einlesen:

    @SeppJ Q soll die Größe des Arrays bestimmen.

    Versuch dir mal zu erschließen, warum ich diese Fragen wohl gestellt haben könnte, dann kommst du vielleicht auf eine bessere Antwort. Hinweis: Manchmal stellen Leute Fragen, obwohl sie gar nicht an der buchstäblichen Antwort auf die Frage interessiert sind.



  • Gut, ich glaube nach etwas herumprobieren habe ich einen Lösungsansatz. Ich versuche ein 2D-Array zu verwenden, dann mittels eines Unterprogramms den einzelnen String erst einzulesen, dann in das Hauptarray zu kopieren. Leider hört das Programm nach Zeile 10 scanf auf. Der Compiler meckert über den Rückgabetyp der Unterfunktion, wo denke ich auch der Fehler liegt, da ja nur ein einzelner Buchstabe erwartet wird. Welcher Rückgabetyp "akzeptiert" denn mein Array?

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    char Einlesen();
    
    int main(){
    
        int w = 0, i = 0;
        printf("Anz. Wörter: "); scanf("%d", &w);
        char array[w][50];
        
        for(i=0; i<w; i++){
            strcpy(array[i], Einlesen);
        }
    }
    
    char Einlesen(){
        char wort[50];
        fgets(wort, 50, stdin);
        return wort;
    }
    

  • Mod

    @ShrimpMan sagte in Einzelne Wörter in Liste einlesen:

    Der Compiler meckert über den Rückgabetyp der Unterfunktion, wo denke ich auch der Fehler liegt, da ja nur ein einzelner Buchstabe erwartet wird. Welcher Rückgabetyp "akzeptiert" denn mein Array?

    Keiner (und wenn jetzt irgendein Klugscheißer mit static kommt, dann ignorierst du das). Deswegen machen scanf, fgets, und strcpy das auch alle nicht über den Rückgabewert, obwohl sie alle so etwas wie eine Rückgabe haben. Guck mal, wie die das machen und lass dich davon inspirieren. Wobei du dir dann deine Funktion eigentlich auch sparen kannst, denn ohne direkten Rückgabewert hat deine Einlesen-Funktion nur noch eine Zeile.

    Das ist hier aber eine Sonderregel nur für Arraytypen, bei anderen Typen kannst du das so machen wie du es kennst. Es ist aber trotzdem eine wichtige Regel, weil man so oft Arrays zwischen Funktionen herum reicht.



  • @ShrimpMan Arrays sind in C etwas speziell.

    Da solltest du nochmal in deinen Unterlagen (oder womit auch immer du C lernst) reinschauen, denn das ist absolute Grundlage in C.

    Man kann Arrays nicht (ohne schmutzige Tricks) als Ganzes an Funktionen übergeben oder als Rückgabewert bekommen. Da kommen dann die Pointer/Adressen ins Spiel und machen die Sache für Anfänger kompliziert.



  • So, habe jetzt die Unterfunktion komplett weggespart und fgets in den strcpy befehl eingesetzt. Jetzt liest das Programm die Strings schön ein und gibt Sie wieder aus. Nur läuft die obere for-Schleife einmal zu viel durch, jedoch führt Sie beim ersten Durchlauf nur printf aus und sonst nichts. Die Ausgabe sieht so aus:

    Anz. Wörter: 3
    Wort 1: Wort 2: hallo
    Wort 3: huhu 
    Wort 4: test
    
    hallo
    huhu
    test
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    int main(){
    
        int w = 0, i = 0; 
        printf("Anz. Wörter: "); scanf("%d", &w);
        char w_array[w][50];                            
        char wort[50];
        
        for(i=0; i<=w; i++){
            printf("Wort %d: ", i+1);
            strcpy(w_array[i], fgets(wort, 50, stdin) );
            memset(wort, 0, 50); 
            fflush(stdin);
        }
    
        for (i=0; i<=w; i++){
            printf("%s", w_array[i]);
        }
        
    }
    

    Wenn die Schleife einmal zu viel durchlaufen würde, müsste doch alles einmal zu viel kommen und nicht nur der printf Befehl?



  • for(i=0; i<=w; i++)
    

    für w = 3, wie oft wird die Schleife durchlaufen (also welche Werte nimmt i an)?

    Bei der ersten Eingabe ist noch der Zeilenumbruch im Puffer, so daß dann ein leerer String eingelesen wird (der auch in Zeile 5 deiner Ausgabe ausgegeben wird).

    PS: Du kannst auch direkt in das Array einlesen, ohne danach dann den String kopieren zu müssen.
    Und fflush(stdin) ist undefiniertes Verhalten, es ist nur für Ausgabeströme definiert, s. fflush (auch wenn die deutsche Übersetzung nicht die beste ist - wenn du englisch kannst, dann nimm gleich die englische Referenz: fflush).



  • Dieser Beitrag wurde gelöscht!


  • @Th69 Danke für deine Antwort, das da eine Leerzeile zwischen ist leuchtet jetzt erst ein.
    Habe mein Programm jetzt soweit umgeschrieben und angepasst, dass es funktioniert:

    Die eine Zeile habe ich dabei aus einem früheren Frage von mir, mit einem - jetzt weiß ich es - ähnlichen Problem.

    Hier mal der Code:

    
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    int main(){
        
        int clear;
        int w = 0, i = 0; 
        printf("Anz. Wörter: "); scanf("%d", &w);
        char w_array[w][50];                            
        while((clear = getchar()) != '\n' && clear != EOF);
        
        for(i=0; i<w; i++){
            printf("Wort %d: ", i+1);
            fgets(w_array[i], 50, stdin);
        }
    
        for (i=0; i<w; i++){
            printf("%s", w_array[i]);
        }
        
    }
    
    


  • @ShrimpMan fgets liest ganze Zeilen ein (sofern sie nicht zu lang sind) und speichert das '\n' (von der Entertaste) mit ab.

    %s bei scanf liest Wörter (von Whitespace getrennte Zeichen) ein.
    Dann ist, bei richtiger Eingabe, auch die while-Schleife nicht mehr nötig.


Anmelden zum Antworten