C- niedziałający kod z książki "Język ANSI C"

0

Cześć!
Jestem tu zupełnie nowy (tak na forum, jak w temacie programowania). Studiuję teraz książkę "Język ANSI C" autorstwa Kernighana i Richie. W pierwszym rozdziale (elementarz) jest kilka razy podany pewien kod, który nie chce mi się nigdy wykonać. Podam prosty przykład programu do liczenia znaków w tekście.

#include <stdio.h>
main()
{
    int c, znaki;
    znaki = 0;
    while((c=getchar())!=EOF)
    {
        ++znaki;
    }
    printf("W tekscie bylo %d znakow", znaki);
}

dodałem code, lepiej późno niż wcale - msm

Ten motyw liczenia czegoś w tekście powtarza się wielokrotnie - na końcu, po zakończeniu pracy pętli while, podawany jest tekstowo wynik. Problem w tym, że gdy odpalam programik w konsoli, nie ma tego rezultatu. Jeśli zmienić kod tak, by podawał wartość zmiennej znaki na bieżąco (czyli po każdym znaku podawał ich aktualną ilość) dzieje się to co się stać powinno, natomiast jeśli instrukcja printf występuje Poza pętlą while, efektu brak. Jak mówiłem jestem świeżakiem, więc pewnie czegoś nie rozumiem, ale i w książce ten kod wygląda tak samo. Czy ktoś ma pomysł dlaczego tak się może dziać?
Z góry dzięki za pomoc!

0

Ten kod zadziała gdy OD RAZU będzie coś w stdin - w przeciwnym wypadku mamy KONIEC PLIKU ;)

#include <stdio.h>
int main()
{
    char c;
    int znaki = 0;
    while((c=getchar())!=EOF)
        ++znaki;
    printf("W tekscie bylo %d znakow", znaki);
    return 0;
}

stdin:
123456789
stdout:
W tekscie bylo 9 znakow
http://ideone.com/gDKDL7

0

Przede wszystkim przepraszam za napisanie kodu w taki normalny sposób ;) Ale mi chodzi o coś takiego, że odpalam program w konsoli. Wpisuję jakikolwiek kod, klikam enter i... brak reakcji. Rozumiem, że ten kod wprowadzam, kliknięciem entera, właśnie do stdin?

0

EOF- end of file;
Tak wygląda kod który robi to co oczekujesz:

#include <stdio.h>
int main()
{
        char c;
        int znaki = 0;
        while((c=getchar())!='\n'/*znak nowej linii*/)
                ++znaki;
        printf("W tekscie bylo %d znakow", znaki);
        return 0;
}

stdin:

12345
tego nie policzy

stdout:
W tekscie bylo 5 znakow
http://ideone.com/BfoEhI

0

Czy to znaczy po prostu, że tekst wprowadzony do konsoli, a zatwierdzony Enterem nie zawiera (nie kończy się) znaku EOF? W sumie byłoby to logiczne skoro to end of FILE.

0

Pod windowsami na początku wiersza naciśnij <ctr-z> po czym <enter>. Będzie to potraktowano jako koniec pliku EOF.

0

OK. Dziękuję za wyjaśnienie tematu i przepraszam za bałagan.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0