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

Odpowiedz Nowy wątek
2013-09-14 13:34
Piterq
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!

edytowany 1x, ostatnio: msm, 2016-12-13 18:26

Pozostało 580 znaków

2013-09-14 13:43
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

edytowany 4x, ostatnio: spartanPAGE, 2013-09-14 13:45

Pozostało 580 znaków

2013-09-14 13:54
Piterq
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?

Pozostało 580 znaków

2013-09-14 13:59
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

Pozostało 580 znaków

2013-09-14 14:01
Piterq
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.

Pozostało 580 znaków

2013-09-14 14:07
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-09-14 14:21
Piterq
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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