Wörter mit getchar zählen



  • Hallo Leute,

    wir sollen per Fileumlenkung in unserem Quell-Code die Wörter, Zeilen und Zeichen etc. zählen.

    Ich hab das ganze versucht über getchar zu machen, also einfach jedes zeichen einzeln anzugucken und dann zu entscheiden, was zu machen ist.

    Wenn ich das ganze mit wc (arbeite mit nem mac) vergleiche, dann stimmen die Anzahl der Zeichen und Zeilen schonmal überein (für meinen Quellcode und auch ein triviales Beispiel zum testen).

    Leider werden die Wörter nicht korrekt von meinem Alg. gezählt.
    Bei dem trivialen Bsp. (2 Zeilen mit Wörtern und Zahlen) stimmt es, aber sobald ich den Quellcode durchjage, zählt er zu wenige Wörter.

    Da ist meine erste Frage (und sagt nicht ich solle meinen Lehrer fragen ^^), was ist ein Wort? Nur alphanumerische Zeichen getrennt durch Leerzeichen, Tabulator, Newline, ... oder auch einzeln rumstehende Zahlen, Klammern, ...?

    Die Frage ist ja, wenn ich jedes Zeichen einzeln durchgehe, wie erkenne ich dann ein Wort?
    Meine Idee war es, dass ich prüfe, ob das vorhergehende Zeichen ein Delimiter ist, wenn ja, dann muss das aktuelle Zeichen ja der Anfang eines neuen Wortes sein. Zudem dacht ich, dass nur alphanumerische Wörter erlaubt sind (bei wc anscheint auch Sonderzeichen...)
    Wenn ich die abfrage allerdings vor das 'isalnum()' setze, bekomm ich zu viele Zählungen 😞

    Hier die entsprechenden Code-Ausschnitte:

    do{
    		in = getchar();
    
    		numChars++;
    		...
    
    		if((iCheck = isalnum(in)) > 0){
    			//alnum char
    			numAlpha++;
    			...
    			if(isDelim(lastIn) > -1) numWords++;
    		        ...
    		}
    		...
    
    		lastIn = in;
    	}while(in != EOF);
    

    Anmerkung:
    'isDelim()' prüft, ob das Zeichen eines der definierten Delimiter ist und gibt -1 zurück wenn nicht.

    mfg
    ani



  • Es gibt in C und dem Standard keine eindeutige Definition von "Wort".
    Es ist abstrus, hier im Forum nachzufragen, was dein Lehrer wohl mit Wort meinen könnte, bloß weil du dich nicht traust, ihn zu fragen.

    Oft wird bei C mit Wort eine durch Whitespaces getrennte char-Folge gemeint, und die lässt sich sehr einfach mit %s und *scanf ermitteln.



  • tjaaaaa... sehr hilfreich.

    Ich bezweifle mal stark, dass sich der Lehrer über einen Anruf übers Wochende freuen wird ^^

    Es geht auch mehr darum, was in meiner Variante falsch laufen könnte (im Vergleich zur 'wc' Zählung).



  • info schrieb:

    wc defines a word as a set of contiguous letters, numbers and/or symbols which are separated from other characters by one or more spaces, tabs and/or newline characters (which are generated when the RETURN key is pressed). When counting the number of characters, all characters are counted, not only letters, numbers and symbols, but also spaces, tabs and newline characters. A line is only counted if it ends with a newline character.

    Damit ist isalnum() wegen 'symbols' nicht richtig.



  • ok danke,
    hab die abfrage jetzt vor das "isalnum" gepackt. Hatte vorher nur vergessen, nur zu fragen, ob dads aktuelle zeichen kein delimiter ist.

    So

    if(isDelim(in) == -1 && isDelim(lastIn) > -1) numWords++;
    

    scheint es nun einwandfrei zu funktionieren.

    danke


Anmelden zum Antworten