Je vous écrit car quelque chose me tracasse un peu. On n'a pas vraiment
vu en cours l'utilisation de getchar, mais le prof l'a utilisé quelque
fois dans ses programmes de corrections, et dans un de ces programmes,
il y avait à deux ou trois lignes d'intervalles :
getchar() /* vidage du buffer */
et
c = getchar()
Il nous a donc expliqué ça en 5 secondes, en nous disant que getchar de
rien servait à vider le buffer... Sauf que dans le deuxième cas, on a
aussi un getchar de rien et cette fois il sert à capturer un caractère
saisi au clavier. Lorsqu'on lui a fait la remarque il a dit "ah mais ça
c'est les aléas du C"...
Bon. J'ai regardé sur internet, et pour vider le buffer on dit
d'utiliser fflush(stdin). Est ce que le prof a raconté n'importe quoi et
qu'on peut aussi vider le buffer avec getchar ? Avec quoi d'autre ?
Je crois avoir compris que l'on vide le buffer car sinon, getchar
n'attend pas que l'on saisisse un caractère et prendrai le dernier qui a
était tapé au clavier (ou le premier ?). Mais alors pourquoi je trouve
plein d'exemple d'utilisation de getchar semblable à celui là :
while ((c= getchar()) != 'q')
putchar(c);
ou on ne vide pas le buffer et ça marche très bien (mais putchar attend
que l'on tape entrée et ressort tout en une seule fois !?)
Avec d'autres programmes desfois j'ai eu des caractères bizarres...
Bref merci de m'aider a comprendre comment marche cette macro (est ce
qu'une macro est un type de fonction ou bien il faut séparer les deux ?)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Bruno Desthuilliers
SoULiAne wrote:
Bonjour,
Je vous écrit car quelque chose me tracasse un peu. On n'a pas vraiment vu en cours l'utilisation de getchar, mais le prof l'a utilisé quelque fois dans ses programmes de corrections, et dans un de ces programmes, il y avait à deux ou trois lignes d'intervalles :
getchar() /* vidage du buffer */
et
c = getchar()
Il nous a donc expliqué ça en 5 secondes, en nous disant que getchar de rien servait à vider le buffer... Sauf que dans le deuxième cas, on a aussi un getchar de rien et cette fois il sert à capturer un caractère saisi au clavier. Lorsqu'on lui a fait la remarque il a dit "ah mais ça c'est les aléas du C"...
Bon. J'ai regardé sur internet, et pour vider le buffer on dit d'utiliser fflush(stdin). Est ce que le prof a raconté n'importe quoi et qu'on peut aussi vider le buffer avec getchar ? Avec quoi d'autre ?
Je crois avoir compris que l'on vide le buffer car sinon, getchar n'attend pas que l'on saisisse un caractère et prendrai le dernier qui a était tapé au clavier (ou le premier ?). Mais alors pourquoi je trouve plein d'exemple d'utilisation de getchar semblable à celui là :
while ((c= getchar()) != 'q') putchar(c);
ou on ne vide pas le buffer et ça marche très bien (mais putchar attend que l'on tape entrée et ressort tout en une seule fois !?)
Bon, reprenons...
Déjà, tu oublie fflush(stdin).
Ensuite : - getchar() lit un caractère sur stdin (qui peut être relié au clavier, ou à n'importe quoi d'autre - un fichier par exemple) et le renvoie sous la forme d'un entier. En cas d'erreur de lecture ou de fin de fichier, getchar() renvoie EOF.
- putchar() écrit un caractère sur stdout (qui peut être relié à l'écran ou à n'importe quoi d'autre - un fichier par exemple...).
Il arrive que lors d'une lecture sur stdin, la fonction de lecture (getchar(), fgets(), scanf() etc...) ne lise pas tous les caractères. Il reste donc des caractères non lus. Si on sait combien il y a de caractères non lus, et qu'on sait qu'on ne s'intéresse pas à ces caractères, on peut appeler getchar() autant de fois qu'il y a de caractères à 'zapper'. Un cas courant est d'avoir une fonction de lecture qui laisse dans stdin le caractère de fin de ligne ('n'), et d'appeler getchar() (sans se soucier de ce qu'il renvoie) pour se débarrasser de cette fin de ligne avant de reprendre la lecture.
Avec d'autres programmes desfois j'ai eu des caractères bizarres...
Poste un exemple (code compilable, réduit au strict minimum nécessaire pour reproduire le problème). Il est difficile de répondre comme ça dans l'absolu !-)
Bref merci de m'aider a comprendre comment marche cette macro (est ce qu'une macro est un type de fonction ou bien il faut séparer les deux ?)
Une macro n'est pas un type de fonction, non. Une macro est un bout de texte défini par l'instruction #define du préprocesseur, et dont toute occurrence dans le source sera remplacée par sa définition avant la compilation.
Exemple :
#include <stdio.h> #define MAGIC_NUMBER 42 int main(void) { printf("le nombre magique est %dn", MAGIC_NUMBER); return 0; }
MAGIC_NUMBER est une macro.
Maintenant, une macro peut être plus complexe que ça, et recevoir des arguments, ce qui permet de simuler (avec certaines limites et quelques pièges) le comportement d'une fonction, en économisant le coût d'un appel de fonction.
(après relecture : je ne sais pas si j'ai été très clair... Mais bon, pas mieux pour ce matin) Bruno
SoULiAne wrote:
Bonjour,
Je vous écrit car quelque chose me tracasse un peu. On n'a pas vraiment
vu en cours l'utilisation de getchar, mais le prof l'a utilisé quelque
fois dans ses programmes de corrections, et dans un de ces programmes,
il y avait à deux ou trois lignes d'intervalles :
getchar() /* vidage du buffer */
et
c = getchar()
Il nous a donc expliqué ça en 5 secondes, en nous disant que getchar de
rien servait à vider le buffer... Sauf que dans le deuxième cas, on a
aussi un getchar de rien et cette fois il sert à capturer un caractère
saisi au clavier. Lorsqu'on lui a fait la remarque il a dit "ah mais ça
c'est les aléas du C"...
Bon. J'ai regardé sur internet, et pour vider le buffer on dit
d'utiliser fflush(stdin). Est ce que le prof a raconté n'importe quoi et
qu'on peut aussi vider le buffer avec getchar ? Avec quoi d'autre ?
Je crois avoir compris que l'on vide le buffer car sinon, getchar
n'attend pas que l'on saisisse un caractère et prendrai le dernier qui a
était tapé au clavier (ou le premier ?). Mais alors pourquoi je trouve
plein d'exemple d'utilisation de getchar semblable à celui là :
while ((c= getchar()) != 'q')
putchar(c);
ou on ne vide pas le buffer et ça marche très bien (mais putchar attend
que l'on tape entrée et ressort tout en une seule fois !?)
Bon, reprenons...
Déjà, tu oublie fflush(stdin).
Ensuite :
- getchar() lit un caractère sur stdin (qui peut être relié au clavier,
ou à n'importe quoi d'autre - un fichier par exemple) et le renvoie sous
la forme d'un entier. En cas d'erreur de lecture ou de fin de fichier,
getchar() renvoie EOF.
- putchar() écrit un caractère sur stdout (qui peut être relié à l'écran
ou à n'importe quoi d'autre - un fichier par exemple...).
Il arrive que lors d'une lecture sur stdin, la fonction de lecture
(getchar(), fgets(), scanf() etc...) ne lise pas tous les caractères. Il
reste donc des caractères non lus. Si on sait combien il y a de
caractères non lus, et qu'on sait qu'on ne s'intéresse pas à ces
caractères, on peut appeler getchar() autant de fois qu'il y a de
caractères à 'zapper'. Un cas courant est d'avoir une fonction de
lecture qui laisse dans stdin le caractère de fin de ligne ('n'), et
d'appeler getchar() (sans se soucier de ce qu'il renvoie) pour se
débarrasser de cette fin de ligne avant de reprendre la lecture.
Avec d'autres programmes desfois j'ai eu des caractères bizarres...
Poste un exemple (code compilable, réduit au strict minimum nécessaire
pour reproduire le problème). Il est difficile de répondre comme ça dans
l'absolu !-)
Bref merci de m'aider a comprendre comment marche cette macro (est ce
qu'une macro est un type de fonction ou bien il faut séparer les deux ?)
Une macro n'est pas un type de fonction, non. Une macro est un bout de
texte défini par l'instruction #define du préprocesseur, et dont toute
occurrence dans le source sera remplacée par sa définition avant la
compilation.
Exemple :
#include <stdio.h>
#define MAGIC_NUMBER 42
int main(void)
{
printf("le nombre magique est %dn", MAGIC_NUMBER);
return 0;
}
MAGIC_NUMBER est une macro.
Maintenant, une macro peut être plus complexe que ça, et recevoir des
arguments, ce qui permet de simuler (avec certaines limites et quelques
pièges) le comportement d'une fonction, en économisant le coût d'un
appel de fonction.
(après relecture : je ne sais pas si j'ai été très clair... Mais bon,
pas mieux pour ce matin)
Bruno
Je vous écrit car quelque chose me tracasse un peu. On n'a pas vraiment vu en cours l'utilisation de getchar, mais le prof l'a utilisé quelque fois dans ses programmes de corrections, et dans un de ces programmes, il y avait à deux ou trois lignes d'intervalles :
getchar() /* vidage du buffer */
et
c = getchar()
Il nous a donc expliqué ça en 5 secondes, en nous disant que getchar de rien servait à vider le buffer... Sauf que dans le deuxième cas, on a aussi un getchar de rien et cette fois il sert à capturer un caractère saisi au clavier. Lorsqu'on lui a fait la remarque il a dit "ah mais ça c'est les aléas du C"...
Bon. J'ai regardé sur internet, et pour vider le buffer on dit d'utiliser fflush(stdin). Est ce que le prof a raconté n'importe quoi et qu'on peut aussi vider le buffer avec getchar ? Avec quoi d'autre ?
Je crois avoir compris que l'on vide le buffer car sinon, getchar n'attend pas que l'on saisisse un caractère et prendrai le dernier qui a était tapé au clavier (ou le premier ?). Mais alors pourquoi je trouve plein d'exemple d'utilisation de getchar semblable à celui là :
while ((c= getchar()) != 'q') putchar(c);
ou on ne vide pas le buffer et ça marche très bien (mais putchar attend que l'on tape entrée et ressort tout en une seule fois !?)
Bon, reprenons...
Déjà, tu oublie fflush(stdin).
Ensuite : - getchar() lit un caractère sur stdin (qui peut être relié au clavier, ou à n'importe quoi d'autre - un fichier par exemple) et le renvoie sous la forme d'un entier. En cas d'erreur de lecture ou de fin de fichier, getchar() renvoie EOF.
- putchar() écrit un caractère sur stdout (qui peut être relié à l'écran ou à n'importe quoi d'autre - un fichier par exemple...).
Il arrive que lors d'une lecture sur stdin, la fonction de lecture (getchar(), fgets(), scanf() etc...) ne lise pas tous les caractères. Il reste donc des caractères non lus. Si on sait combien il y a de caractères non lus, et qu'on sait qu'on ne s'intéresse pas à ces caractères, on peut appeler getchar() autant de fois qu'il y a de caractères à 'zapper'. Un cas courant est d'avoir une fonction de lecture qui laisse dans stdin le caractère de fin de ligne ('n'), et d'appeler getchar() (sans se soucier de ce qu'il renvoie) pour se débarrasser de cette fin de ligne avant de reprendre la lecture.
Avec d'autres programmes desfois j'ai eu des caractères bizarres...
Poste un exemple (code compilable, réduit au strict minimum nécessaire pour reproduire le problème). Il est difficile de répondre comme ça dans l'absolu !-)
Bref merci de m'aider a comprendre comment marche cette macro (est ce qu'une macro est un type de fonction ou bien il faut séparer les deux ?)
Une macro n'est pas un type de fonction, non. Une macro est un bout de texte défini par l'instruction #define du préprocesseur, et dont toute occurrence dans le source sera remplacée par sa définition avant la compilation.
Exemple :
#include <stdio.h> #define MAGIC_NUMBER 42 int main(void) { printf("le nombre magique est %dn", MAGIC_NUMBER); return 0; }
MAGIC_NUMBER est une macro.
Maintenant, une macro peut être plus complexe que ça, et recevoir des arguments, ce qui permet de simuler (avec certaines limites et quelques pièges) le comportement d'une fonction, en économisant le coût d'un appel de fonction.
(après relecture : je ne sais pas si j'ai été très clair... Mais bon, pas mieux pour ce matin) Bruno
espie
In article , SoULiAne wrote:
Bon. J'ai regardé sur internet, et pour vider le buffer on dit d'utiliser fflush(stdin). Est ce que le prof a raconté n'importe quoi et qu'on peut aussi vider le buffer avec getchar ? Avec quoi d'autre ?
C'est une connerie. fflush ne fonctionne que sur les flux en sortie.
getchar() sert a recuperer un caractere sur l'entree-standard. Comme tu as affaire a un flux, chaque caractere que tu recuperes est consomme. Que tu le gardes quelque part (c = getchar()) ou que tu le jettes (getchar()) le caractere est consomme.
Apres, les explications de ton prof me semblent vraiment succintes. Vu le ton un peu sarcastique sur lequel elles t'ont ete donnees, j'ai comme l'impression que tu as du etre inattentif un peu avant, ou que tu as rate un cours ou deux, et que ton prof en a eu marre de reexpliquer... mais je peux me tromper.
In article <hml2uvcomsueg4ja20t0d5gttdidst1sd9@4ax.com>,
SoULiAne <cubixNOSPAM@caramail.com> wrote:
Bon. J'ai regardé sur internet, et pour vider le buffer on dit
d'utiliser fflush(stdin). Est ce que le prof a raconté n'importe quoi et
qu'on peut aussi vider le buffer avec getchar ? Avec quoi d'autre ?
C'est une connerie. fflush ne fonctionne que sur les flux en sortie.
getchar() sert a recuperer un caractere sur l'entree-standard. Comme
tu as affaire a un flux, chaque caractere que tu recuperes est consomme.
Que tu le gardes quelque part (c = getchar()) ou que tu le jettes
(getchar()) le caractere est consomme.
Apres, les explications de ton prof me semblent vraiment succintes.
Vu le ton un peu sarcastique sur lequel elles t'ont ete donnees, j'ai
comme l'impression que tu as du etre inattentif un peu avant, ou que tu
as rate un cours ou deux, et que ton prof en a eu marre de reexpliquer...
mais je peux me tromper.
Bon. J'ai regardé sur internet, et pour vider le buffer on dit d'utiliser fflush(stdin). Est ce que le prof a raconté n'importe quoi et qu'on peut aussi vider le buffer avec getchar ? Avec quoi d'autre ?
C'est une connerie. fflush ne fonctionne que sur les flux en sortie.
getchar() sert a recuperer un caractere sur l'entree-standard. Comme tu as affaire a un flux, chaque caractere que tu recuperes est consomme. Que tu le gardes quelque part (c = getchar()) ou que tu le jettes (getchar()) le caractere est consomme.
Apres, les explications de ton prof me semblent vraiment succintes. Vu le ton un peu sarcastique sur lequel elles t'ont ete donnees, j'ai comme l'impression que tu as du etre inattentif un peu avant, ou que tu as rate un cours ou deux, et que ton prof en a eu marre de reexpliquer... mais je peux me tromper.