Est-il possible de jeter un coup d’œil sur le tampon stdin?

Nous soaps que stdin est, par défaut, une entrée en mémoire tampon; la preuve en est l’utilisation de l’un des mécanismes qui “laissent des données” sur stdin , tels que scanf() :

 int main() { char c[10] = {'\0'}; scanf("%9s", c); printf("%s, and left is: %d\n", c, getchar()); return 0; } 

./a.out
Bonjour
bonjour, et à gauche est 10

10 étant newline bien sûr …

J’ai toujours été curieux, y a-t-il un moyen de “jeter un coup d’œil” sur le tampon stdin sans supprimer tout ce qui peut y résider?

MODIFIER
Un meilleur exemple pourrait être:

 scanf("%9[^.]", c); 

Avec une entrée “at.ct”, il me rest maintenant des “données” ( ct\n ) sur stdin , pas seulement une nouvelle ligne.

De manière portable, vous pouvez obtenir le prochain caractère du stream d’entrée avec getchar() , puis le repousser avec ungetc() , ce qui donne un état ungetc() à ungetc() du caractère non supprimé du stream.

La fonction ungetc repousse le caractère spécifié par c (converti en caractère unsigned char ) sur le stream d’entrée pointé par stream. Les caractères renvoyés seront renvoyés par les lectures suivantes sur ce stream dans l’ordre inverse de leur diffusion.

La norme ne garantit qu’un seul caractère de refoulement, mais vous pouvez généralement en repousser davantage.

Comme mentionné dans les autres réponses resp. les commentaires ici, dans la pratique, vous pouvez presque certainement jeter un coup d’œil sur le tampon si vous fournissez votre propre tampon avec setvbuf , bien que cela ne soit pas sans problèmes:

Si buf n’est pas un pointeur null, le tableau setvbuf peut être utilisé à la place d’un tampon alloué par la fonction setvbuf

cela laisse la possibilité que le tampon fourni ne soit pas utilisé du tout.

Le contenu du tableau est indéterminé à tout moment.

cela signifie que vous n’avez aucune garantie que le contenu du tampon reflète l’entrée réelle (et cela rend l’utilisation du tampon indéfinie si elle a une durée de stockage automatique, si nous sums pointilleux).

Cependant, dans la pratique, le principal problème serait de savoir où commence et où se termine la partie non consommée de l’entrée en mémoire tampon dans la mémoire tampon.

Vous pouvez définir votre propre tampon avec setvbuf sur stdin et y jeter un coup d’œil à tout moment.

Si vous voulez regarder le tampon stdin sans le changer, vous pouvez lui dire d’utiliser un autre tampon avec setbuf , en utilisant un tableau setbuf vous pouvez accéder:

 char buffer[BUFSIZ]; if (setbuf(stdin, buffer) != 0) // error getchar(); printf("%15s\n", buffer); 

Cela vous permet de voir quelque chose de plus ungetc , mais je ne pense pas que vous puissiez aller plus loin de manière portable.

En fait, c’est légal mais cela n’est pas correct pour la norme, citant celle-ci à propos de setvbuf ( setbuf a le même comportement):

Le contenu du tableau est indéterminé à tout moment.

Ce n’est donc pas ce dont vous avez besoin si vous souhaitez une portabilité complète et une conformité aux normes, mais je ne vois pas pourquoi la mémoire tampon ne devrait pas contenir ce qui est attendu. Cependant, cela semble fonctionner sur mon ordinateur.

Attention, vous devez fournir au moins un tableau de caractères BUFSIZ à setbuf et vous ne devez effectuer aucune opération d’E / S sur le stream le précédant. Si vous avez besoin de plus de flexibilité, jetez un coup d’œil à setvbuf .