2010-02-02 20 views
7

na przykład:getchar() i putchar()

#include <stdio.h> 

main() 
{ 
    long nc; 

    nc = 0; 
    while (getchar() != EOF) 
     ++nc; 
    printf("%ld\n", nc); 
} 

Nie bardzo rozumiem. putchar() wyprowadziłby tę postać, ale dlaczego po EOF wyrzuca wszystkie postacie i gdzie pamięta te wszystkie postacie? Dzięki.

+5

Umm ... w tym kodzie nie ma putchar(). – SoapBox

+0

O czym mówi się "putchar()"? – mob

+2

Myślę, że napisałeś zły program z K & R! –

Odpowiedz

8

Nazywa buforowanie i jest to zrobione przez system operacyjny. Zwykle wykonuje buforowanie liniowe, w którym zapisuje po prostu każdy znak, który wpisujesz w pamięci, a następnie zapisuje go w pliku, gdy napotka linię podziału. Oszczędza to zasoby, ponieważ operacje na plikach zabierają znacznie więcej czasu niż inne operacje. Zamiast robić wyjście z każdym znakiem, czeka na grupę postaci do zebrania w buforze i wypisuje je za jednym razem.

To tylko sprytny manewr wykonany przez system operacyjny, którego ty, programista, nie musisz się martwić. Po prostu rzucaj swoimi postaciami po kolei i pozwól systemowi zająć się resztą na swój własny sposób.

1

Nie, gdzie ten kod tylko opróżnia wejście i napisz ile znaków pozostało przed spłukaniem.

to, aby mieć pewność, że ma caracters pozostające w pliku wejściowego (stdin)

1

Spójrzmy na kod:

#include <stdio.h> 

tej pory tak dobrze ...

main() 
{ 
  1. Funkcja main() zawsze zwraca int. Zawsze.
  2. Deklarowanie funkcji bez powrotu typ jest złą formą, ponieważ domyślnie jest to int, ale ludzie nie pamiętają o tym, że jest to łatwe podczas czytania kodu.

Przechodząc ...

long nc; 

nc = 0; 

dobrej formie. Zmienna jest inicjowana przed jej użyciem.

while (getchar() != EOF) 
    ++nc; 

To trochę skomplikowane. Ale jeden krok na raz.

  1. Funkcja getchar zwraca int ze standardowego wejścia.
  2. Ta wartość jest następnie porównywana z EOF.
  3. Jeżeli wartość int ze standardowego wejścia nie EOF zmienna nc jest zwiększany.

Aby wyjść z pętli while, należy wygenerować EOF ze standardowego wejścia.

Uwaga: Żadna z wartości odczytanych ze standardowego wejścia zapisane są . Każda wartość jest odrzucana po oszacowaniu wyrażenia.

Styl: Proponuję użyć '{' i '}' po każdym oświadczeniu while. Jest to przyzwyczajenie, do którego należy się przyłączyć.

printf("%ld\n", nc); 

Powyższa instrukcja drukuje (wyświetla) wartość w nc. Wartość w nc reprezentuje liczbę znaków odczytanych ze standardowego wejścia. To oświadczenie powoduje, że nie wyświetla żadnych znaków ze standardowego wejścia.

} 

Wreszcie, program main musi zwrócić wartość do systemu operacyjnego. Dwie przenośne wartości to EXIT_SUCCESS i EXIT_FAILURE, które są zdefiniowane w stdlib.h. Określenie jednej z tych wartości byłoby również dobrym nawykiem.

BTW, w podanym przykładzie nie ma numeru putchar (który skopiowałem do tej odpowiedzi).

1

[To nie jest odpowiedź, ale nie można umieścić kod w komentarzach]

Chyba masz na myśli coś takiego:

#include <stdio.h> 

main() 
{ 
    long nc; 
    nc = 0; 
    char c; 
    while ((c = getchar()) != EOF) 
    { 
     putchar(c); /* prints one char */ 
     ++nc; 
    } 
    printf("%ld\n", nc); /* prints the number of characters read */ 
} 
1

putchar umieścić char Into the bufor, gdy dojdzie do wpisania, to spowoduje wyświetlenie wyjścia liniowego na ekranie.

+0

Dzięki! Zastanawiam się również, dlaczego postacie nie pojawiają się na ekranie podczas pisania, pomimo 'putchar()' w pętli (nie w powyższym kodzie, ale w przykładzie KR). – Curious2learn