Chúng tôi biết rằng, theo mặc định, stdin
là một đầu vào được lưu vào bộ đệm; bằng chứng đó là trong việc sử dụng của bất kỳ của các cơ chế đó "lại dữ liệu" trên stdin
, chẳng hạn như scanf()
:Có anyway để peek tại bộ đệm stdin?
int main()
{
char c[10] = {'\0'};
scanf("%9s", c);
printf("%s, and left is: %d\n", c, getchar());
return 0;
}
./a.out
chào
hello, và bên trái là 10
10
là newline tất nhiên ...
tôi luôn tò mò, là có anyway để "ú" ở stdin
bộ đệm mà không xóa bất kỳ thứ gì có thể nằm ở đó?
EDIT
Một ví dụ tốt hơn có thể là:
scanf("%9[^.]", c);
Với một đầu vào của "at.ct", bây giờ tôi có "dữ liệu" (ct\n
) còn lại trên stdin
, không chỉ là một dòng mới.
Bạn có thể 'ungetc()' sau khi nhìn trộm. Đủ tốt? –
@DanielFischer - Tôi đoán nó không phải là xấu ... Điều gì nếu có một bó toàn bộ các ký tự còn lại? Tôi có thể biết độ dài của dữ liệu còn lại trên stdin? hoặc tôi có thể 'ungetc()' nhiều hơn thì một nhân vật? – Mike
"Một nhân vật của pushback được đảm bảo. Nếu hàm' ungetc' được gọi quá nhiều lần trên cùng một luồng mà không có thao tác đọc hoặc định vị tập tin trên luồng đó, thao tác có thể thất bại ". Thông thường, bạn có thể 'ungetc' nhiều hơn một, nhưng chỉ có một cái được đảm bảo. –