2013-06-14 15 views
5

Jaki jest cel wprowadzenia miejsca w scanf jak tenjaki jest cel umieszczenia spacji w scanf takich jak ten scanf ("% c", & ch) w miejsce scanf ("% c", & ch)?

scanf(" %c",&ch) 

zamiast

scanf("%c",&ch)? 

Również to, co jest w bufor wejściowy fflush(stdin)?

+0

Umieszczenie tam spacji spowoduje zignorowanie wszelkich białych znaków przed odczytaniem postaci. – SBI

+0

'stdin', inputstream twojego programu ..... cokolwiek wprowadzisz przez twoją konsolę zostanie umieszczone w tym buforze – pinkpanther

+1

' fflush() 'służy do wypłukiwania _output_ buforów, więc wywołanie go na strumieniu wejściowym jest bez znaczenia (zazwyczaj z powodu nieporozumienia, że ​​odrzuci wszelkie dane wejściowe, które są już buforowane). – Barmar

Odpowiedz

3

co jest celem wprowadzenie miejsca w scanf jak ten scanf ("% c" & CH) w miejsce scanf ("% c", & CH)?

Tak więc scanf zignoruje wszystkie spacje, zanim napotkany zostanie pierwszy znak spoza obszaru.

Co to jest bufor wejściowy w fflush (stdin)?

To, co wprowadzisz do konsoli, będzie dostępne w strumieniu stdin.

Nie należy jednak opróżniać tego strumienia, ponieważ jest to niezdefiniowane zachowanie. Jeśli chcesz odrzucić znaki wprowadzone po scanf, możesz je przeczytać i odrzucić.

+0

Dziękuję wszystkim, ale nawet jeśli wypróżnię strumień wejściowy, czy opróżni on cały strumień wejściowy, czy tylko białe spacje lub znaki nowej linii? Również Kiedy zdałbym sobie sprawę, że muszę usunąć białe spacje w strumieniu wejściowym znaków lub muszę to wyraźnie zrobić w każdym odczytaniu znaków? –

-1

Aby podać spację od ostatniego obiektu, jeśli nie, na przykład ciąg, wszystko będzie razem, bez spacji między nimi.

+2

Myślę, że musisz ponownie przeczytać pytanie, twoja odpowiedź nie jest poprawna i nie ma sensu. OP mówi o 'scanf', a nie' printf' – Mike

+0

Dziękuje wszystkim, ale nawet jeśli wypróżnię strumień wejściowy, czy opróżni cały strumień wejściowy, czy tylko białe spacje lub znaki nowej linii? Również Kiedy zdałbym sobie sprawę, że muszę usunąć białe spacje w strumieniu wejściowym znaków lub muszę to wyraźnie zrobić w każdym odczytaniu znaków? –

2

Przestrzeń w scanf w tym przypadku mówi scanf, aby zignorował wszystkie znaki prowadzące do spacji przed odczytaną postacią. Nawet jeśli nie ma żadnych spacji przed znakiem, kod będzie działał i poprawnie odczytał znak.

Nie jestem pewien, o co pytasz w swoim ostatnim pytaniu, ale standard jest standardowym strumieniem wejściowym dla twojego programu.

+0

Dziękuję wszystkim, ale nawet jeśli wypróżnię strumień wejściowy, czy opróżni on cały strumień wejściowy, czy tylko białe spacje lub znaki nowej linii? Również Kiedy zdałbym sobie sprawę, że muszę usunąć białe spacje w strumieniu wejściowym znaków lub muszę to wyraźnie zrobić w każdym odczytaniu znaków? –

4

Ponieważ przestrzeń przed %c ignoruje wszystkie spacje. *scanf rodzina funkcji ignoruje wszystkie spacje przed domyślnie % z wyjątkiem %c, %[ i %n. Wspomniano o tym w C11:

7.21.6.2.8

wejściowy spacje (określone przez funkcję isspace) są pomijane, o ile nie specyfikacji obejmuje [C lub N specyficzny.

Aby być kompletne, oto część, która mówi wszystkim spacje będą ignorowane:

7.21.6.2.5

Dyrektywa składa się z charakterem spacji (S) jest wykonywany przez wczytać dane wejściowe do pierwszego niepustego znaku (który pozostaje nieprzeczytany) do lub do momentu, gdy nie będzie już można odczytać żadnych znaków. Dyrektywa nigdy nie zawodzi.


Odnośnie drugiego pytania, fflush(stdin) przyczyny niezdefiniowanej zachowań i nie mogą być wykorzystywane (Kopalnia nacisk):

7.21.5.2.2

Jeśli punkty strumienia do wyjścia strumień lub strumień aktualizacji, w którym nie została wprowadzona ostatnia operacja , funkcja fflush powoduje niepisanie danych dla tego strumienia , które mają zostać dostarczone do środowiska hosta w celu zapisania w pliku; w przeciwnym razie zachowanie jest niezdefiniowane.

+0

Dziękuję wszystkim, ale nawet jeśli wypróżnię strumień wejściowy, czy opróżni on cały strumień wejściowy, czy tylko białe spacje lub znaki nowej linii? Również Kiedy zdałbym sobie sprawę, że muszę usunąć białe spacje w strumieniu wejściowym znaków lub muszę to wyraźnie zrobić w każdym odczytaniu znaków? –

+0

@RahulKathuria, nigdy nie opróżniasz strumieni wejściowych. Jeśli twój system operacyjny sformatuje twój dysk twardy jako wynik, to całkowicie twoja wina. Jeśli spróbuje być miły, po prostu wyrzuci wszystkie dane wejściowe, więc nie będziesz już nic czytać. Więc, nie spłukuj strumieni wejściowych, ok? – Shahbaz

+0

Po drugie, '* scanf' pomija dla Ciebie białe znaki, więc nie ma wyboru. Jedynym miejscem, w którym masz wybór, jest '% c' (wątpię, że użyłbyś'% ['). Tam, jeśli jesteś zainteresowany czytaniem spacji, umieść spację przed nią ('"% c "'). Jeśli nie jesteś zainteresowany białymi znakami, nie umieszczaj spacji przed nim ('"% c "'). To takie proste. Reszta będzie zarządzana przez 'scanf'. – Shahbaz

2
scanf(" %c",&ch); 

Jak na man page,

Białe znaki (takie jak wykroje, zakładkach lub znakami nowej linii) w ciągu formatu dopasować dowolną ilość białej przestrzeni, tym żaden, na wejściu.

Stdin jest standardowy użytkownik input.The wprowadza dane do programu, to jest najpierw przechowywany w buforze, a następnie, gdy program żąda transferu danych za pomocą operacji odczytu dane są udostępniane do programu. (używając scanf itp.).

+0

Dziękuję wszystkim, ale nawet jeśli przepłuczę strumień wejściowy, czy opróżni on cały strumień wejściowy, czy tylko białe spacje lub znaki nowej linii? Również Kiedy zdałbym sobie sprawę, że muszę usunąć białe spacje w strumieniu wejściowym znaków lub muszę to wyraźnie zrobić w każdym odczytaniu znaków? –

+0

@RahulKathuria 'fflush' opróżni wszystkie postacie. [Jednak nie jest właściwe używanie ze stdin] (http://stackoverflow.com/questions/2979209/using-fflushstdin). –

0

Miałem ten sam problem jakiś czas temu, w którym gdybym spróbował odczytać zmienną za pomocą scanf ("%c", &ans);, nie przeczytałbym niczego. W ten sposób zorientowałem się, że odczytywano znak \n z ostatniego wejścia.

W ten sposób rozwiązałem mój problem przez scanf (" %c", &ans);.

Chociaż nie mogłem zrozumieć wyraźnie twojego drugiego pytania.