Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Wörter zählen in C

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.09.2006, 17:27 Uhr
Xedosh



Hallo an alle,

ich habe dem klassischem C-Programmierlernbuch von Kernighan/Ritchie ein Beispiel für ein kleines Programm entnehmen können, das Wörter, Zeilen und Zeichen zählt und wie folgt aussieht:


C++:
#include <stdio.h>

#define IN 1      /* in einem Wort */
#define OUT 0     /* außerhalb eines Wortes */

/* Zeilen, Worte und Zeichen zaehlen */

main()
{
    int c, nl, nw, nc, state;
    
    state = OUT;
    nl = nw = nc = 0;
    while((c=getchar()) != EOF) {
         ++nc;
         if (c == '\n')
           ++nl;
         if (c == ' ' || c == '\n' || c == '\t')
           state = OUT;
         else if(state == OUT){
             state = IN;
             ++nw;
         }
    }  
    printf("%d %d %d\n", nl, nw, nc-1);
    system("PAUSE");
    return 0;
}


Meine Frage dazu ist, wie genau hier das Wort erkannt wird? Ich habe nachgeschaut wie das mit dem Kontrollstrukturen ist. if scheint zu else if zumindest nach dem ersten if äquivalent zu sein. Also kann ich ich folgender Struktur:
if - if -if -if mit if - else if - else if - else if gleichsetzen.
Wenn ich nun den Kontrollvorgang übersetze, versteh ich aber nun gar nicht wie das Programm ein Wort erkennt:

Während Zeichen eingetippt werden inkrementiere nc. Ist dabei das eingegebene Zeichen die Enter-Taste (neue Zeile), inkrementiere nl. Ist das Zeichen aber eine Leertaste, eine Enter-Taste oder eine Tabulatortaste setze state=OUT, das heißt, das Zeichen ist außerhalb eines Wortes. Nun folgt else if(state==OUT): Ist nun das eingebene Zeichen außerhalb eines Wortes soll es nach meinem Verständniss auf einmal in einem Wort sein: state==IN und es soll Inkrementiert werden. :/

Kann mir das netterweise jemand mal erklären wie das hier fabriziert wird und zu verstehen ist?

Lieben Gruß,
xedosh

Dieser Post wurde am 26.09.2006 um 17:29 Uhr von Xedosh editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
26.09.2006, 17:42 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Das Programm guckt nicht nicht die Wörter an, sondern die Zwischenzeichen...

für sowas würde ich eher strtok nehmen das macht das automatisch...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
26.09.2006, 17:54 Uhr
0xdeadbeef
Gott
(Operator)


Das Programm zählt die Übergänge von Whitespace zu Nicht-Whitespace. Du kannst nicht einfach nur die Leerzeichen zählen, weil du sonst mit einer Eingabe wie

Code:
"foo  bar  baz \t\n\t  qux  quux"


Probleme kriegst.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
26.09.2006, 18:08 Uhr
Xedosh



Alles klar, vielen Dank :)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: