Einzelne Wörter in Liste einlesen



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