Kiedy skanowanie i skanowanie rozpoczyna się?
Wydaje sięscanf
rozpoczyna skanowanie wejścia, gdyWchodzić klawisz jest wciśnięty i chcę to zweryfikować za pomocą poniższego kodu (dla uproszczenia wyeliminowałem sprawdzanie błędów i obsługę).
#include <stdio.h>
int main(int argc, char **argv) {
/* disable buffering */
setvbuf(stdin, NULL, _IONBF, 0);
int number;
scanf("%d", &number);
printf("number: %d\n", number);
return 0;
}
Nadchodzi kolejny problem, po wyłączeniu buforowania wejścia (tylko po to, aby zweryfikować wynik; wiem, że powinienem to robić nigdy w rzeczywistości, w przypadku, gdy przeszkadza to w wynikach), wyjście jest (zwróć uwagę na dodatkowy monit):
$ ./ionbf
12(space)(enter)
number: 12
$
$
który różni się od wyjścia, gdy włączone jest buforowanie wejściowe (brak dodatkowego monitu):
$ ./iofbf
12(space)(enter)
number: 12
$
Wygląda na to, że znak nowej linii jest zużywany, gdy włączony jest bufor. Przetestowałem na dwóch różnych maszynach, jeden z zainstalowanym gcc 4.1.2 i bash 3.2.25, drugi z gcc 4.4.4 i bash 4.1.5, a wynik jest taki sam na obu.
Problemy są następujące:
Jak wyjaśnić różne zachowania, gdy buforowanie wejścia jest włączone i wyłączone?Wracając do pierwotnego problemu, kiedy to robiscanf
rozpocząć skanowanie danych wprowadzanych przez użytkownika? W momencie wejścia postaci? Czy może jest buforowany aż do zakończenia linii?