J'ai eu un peu de temps pour étudier et mettre en oeuvre le code que
tu as recommandé. Après quelques modifications, ça fonctionne très
bien. J'ai même été surpris que getchar() soit aussi souple. Je peux
concaténer ou non la saisie par la simple affectation de 'n' ou
' ' (dans le code dans A:).
size_t ReadUserString(char fBuff[], size_t bufsize)
{
char c ;
int i ;
int limit = bufsize - 1 ;
for ( i = 0 ; (c = getchar()) != 'n' ; i++)
if ( i< limit )
fBuff[i] = c ;
else
{
while ( (getchar()) != 'n' )
;
break ;
}
fBuff[i++] = 'n' ; /* A: version 2 : supprimer cette ligne pour
concatener */
fBuff[i] = ' ' ;
return i ;
}
void WriteMot(char *fPhr[], int nmax)
{
int i ;
printf("nnAffichage : n") ;
for ( i = 0 ; i< MAXLIG ; i++ )
printf("%s", *(fPhr+i)) ; /* B: version 2 : changer "%s" par "%s "
pour ajouter un espace pour la concatenation resultant de la
modification en A */
Comment décrire stdin?
Je crois comprendre que c'est l'entrée standard, en mode terminal,
c'est le clavier, je suppose en mode graphique ou fenêtre, c'est la
souris...
Est-ce que stdin est un fichier sur lequel on peut intervenir?
Est-ce
que je peux dire, en mode terminal, que stdin est composé des touches
du clavier que j'ai pressées?
J'ai eu un peu de temps pour étudier et mettre en oeuvre le code que
tu as recommandé. Après quelques modifications, ça fonctionne très
bien. J'ai même été surpris que getchar() soit aussi souple. Je peux
concaténer ou non la saisie par la simple affectation de 'n' ou
' ' (dans le code dans A:).
size_t ReadUserString(char fBuff[], size_t bufsize)
{
char c ;
int i ;
int limit = bufsize - 1 ;
for ( i = 0 ; (c = getchar()) != 'n' ; i++)
if ( i< limit )
fBuff[i] = c ;
else
{
while ( (getchar()) != 'n' )
;
break ;
}
fBuff[i++] = 'n' ; /* A: version 2 : supprimer cette ligne pour
concatener */
fBuff[i] = ' ' ;
return i ;
}
void WriteMot(char *fPhr[], int nmax)
{
int i ;
printf("nnAffichage : n") ;
for ( i = 0 ; i< MAXLIG ; i++ )
printf("%s", *(fPhr+i)) ; /* B: version 2 : changer "%s" par "%s "
pour ajouter un espace pour la concatenation resultant de la
modification en A */
Comment décrire stdin?
Je crois comprendre que c'est l'entrée standard, en mode terminal,
c'est le clavier, je suppose en mode graphique ou fenêtre, c'est la
souris...
Est-ce que stdin est un fichier sur lequel on peut intervenir?
Est-ce
que je peux dire, en mode terminal, que stdin est composé des touches
du clavier que j'ai pressées?
J'ai eu un peu de temps pour étudier et mettre en oeuvre le code que
tu as recommandé. Après quelques modifications, ça fonctionne très
bien. J'ai même été surpris que getchar() soit aussi souple. Je peux
concaténer ou non la saisie par la simple affectation de 'n' ou
' ' (dans le code dans A:).
size_t ReadUserString(char fBuff[], size_t bufsize)
{
char c ;
int i ;
int limit = bufsize - 1 ;
for ( i = 0 ; (c = getchar()) != 'n' ; i++)
if ( i< limit )
fBuff[i] = c ;
else
{
while ( (getchar()) != 'n' )
;
break ;
}
fBuff[i++] = 'n' ; /* A: version 2 : supprimer cette ligne pour
concatener */
fBuff[i] = ' ' ;
return i ;
}
void WriteMot(char *fPhr[], int nmax)
{
int i ;
printf("nnAffichage : n") ;
for ( i = 0 ; i< MAXLIG ; i++ )
printf("%s", *(fPhr+i)) ; /* B: version 2 : changer "%s" par "%s "
pour ajouter un espace pour la concatenation resultant de la
modification en A */
Comment décrire stdin?
Je crois comprendre que c'est l'entrée standard, en mode terminal,
c'est le clavier, je suppose en mode graphique ou fenêtre, c'est la
souris...
Est-ce que stdin est un fichier sur lequel on peut intervenir?
Est-ce
que je peux dire, en mode terminal, que stdin est composé des touches
du clavier que j'ai pressées?
void WritePhr(char *fpPhr[], char *fpMot, int nmax)
{
int i ;
int sz = nmax ;
void WritePhr(char *fpPhr[], char *fpMot, int nmax)
{
int i ;
int sz = nmax ;
void WritePhr(char *fpPhr[], char *fpMot, int nmax)
{
int i ;
int sz = nmax ;
Pour l'allocation dynamique, si je comprends bien que free est très
utile pour libérer la mémoire et pour la saisie de caractères, fflush
doit étre présent. Il n'y a pas beaucoup d'infos (j'ai pas beaucoup
cherché) mais je peux lire que fflush vide le buffer. C'est un peu
plus de sécurité alors?
Pour l'allocation dynamique, si je comprends bien que free est très
utile pour libérer la mémoire et pour la saisie de caractères, fflush
doit étre présent. Il n'y a pas beaucoup d'infos (j'ai pas beaucoup
cherché) mais je peux lire que fflush vide le buffer. C'est un peu
plus de sécurité alors?
Pour l'allocation dynamique, si je comprends bien que free est très
utile pour libérer la mémoire et pour la saisie de caractères, fflush
doit étre présent. Il n'y a pas beaucoup d'infos (j'ai pas beaucoup
cherché) mais je peux lire que fflush vide le buffer. C'est un peu
plus de sécurité alors?
In article .com>,
wrote:
>Pour l'allocation dynamique, si je comprends bien que free est très
>utile pour libérer la mémoire et pour la saisie de caractères, ffl ush
>doit étre présent. Il n'y a pas beaucoup d'infos (j'ai pas beaucoup
>cherché) mais je peux lire que fflush vide le buffer. C'est un peu
>plus de sécurité alors?
Non, pas de soucis de securite. Je soupconne que tu fais une confusion
frequente: fflush() s'applique aux flux *en sortie*. Lorsque tu vois un
fflush sur une fonction qui interagit avec le clavier et l'ecran, fflush( )
est utilise pour forcer printf() "a afficher" quelque chose.
Par defaut, stdout est en mode "tampon par lignes completes", donc si tu
veux faire un truc tel que:
printf("Entrez un nombre ");
fflush(stdout);
scanf(...);
Ca va mal marcher sans le fflush, vu que printf n'est pas une ligne compl ete.
[sur certains systemes, ca va fonctionner quand meme. Car il existe un
autre langage, C++, qui lui va lier l'entree standard a la sortie standar d,
ce qui fait que toute operation d'entree provoque un flush... et parfois,
ca peut etre remonte jusqu'a la bibliotheque C, ce qui n'est pas interdit .]
De facon assez bizarre, *IL N'Y A PAS* d'equivalent standardise pour l'en tree
standard: tu ne peux pas gicler ce que l'utilisateur a tape "simplement" a
l'instant t ou tu fais une entree.
Si on est sur un systeme POSIX (e.g., Unix/Linux, pour simplifier), il y a
des moyens pour manipuler "proprement" l'entree standard (termios), mais ca
devient assez complexe, et il y plein de petits details a gerer. Dans le
monde DOS/Windows, c'est different. Je connais mal et je laisserai quelqu 'un
d'autre expliquer tout ca s'il a envie (de ce que j'en sais, c'est assez
primitif, cote getch et getche, et je soupconne que windows emule ce
comportement si on fait des appli texte en cochant la case "terminal").
Pour l'embarque, historiquement, c'est des implementations "freestanding" ,
donc la bibliotheque standard, dans l'ensemble, est remplacee par autre
chose qui va s'en rapprocher plus ou moins...
In article <e71547e3-330b-4b84-9a54-64c8c6f39...@x25g2000yqj.googlegroups .com>,
bpascal...@googlemail.com <bpascal...@googlemail.com> wrote:
>Pour l'allocation dynamique, si je comprends bien que free est très
>utile pour libérer la mémoire et pour la saisie de caractères, ffl ush
>doit étre présent. Il n'y a pas beaucoup d'infos (j'ai pas beaucoup
>cherché) mais je peux lire que fflush vide le buffer. C'est un peu
>plus de sécurité alors?
Non, pas de soucis de securite. Je soupconne que tu fais une confusion
frequente: fflush() s'applique aux flux *en sortie*. Lorsque tu vois un
fflush sur une fonction qui interagit avec le clavier et l'ecran, fflush( )
est utilise pour forcer printf() "a afficher" quelque chose.
Par defaut, stdout est en mode "tampon par lignes completes", donc si tu
veux faire un truc tel que:
printf("Entrez un nombre ");
fflush(stdout);
scanf(...);
Ca va mal marcher sans le fflush, vu que printf n'est pas une ligne compl ete.
[sur certains systemes, ca va fonctionner quand meme. Car il existe un
autre langage, C++, qui lui va lier l'entree standard a la sortie standar d,
ce qui fait que toute operation d'entree provoque un flush... et parfois,
ca peut etre remonte jusqu'a la bibliotheque C, ce qui n'est pas interdit .]
De facon assez bizarre, *IL N'Y A PAS* d'equivalent standardise pour l'en tree
standard: tu ne peux pas gicler ce que l'utilisateur a tape "simplement" a
l'instant t ou tu fais une entree.
Si on est sur un systeme POSIX (e.g., Unix/Linux, pour simplifier), il y a
des moyens pour manipuler "proprement" l'entree standard (termios), mais ca
devient assez complexe, et il y plein de petits details a gerer. Dans le
monde DOS/Windows, c'est different. Je connais mal et je laisserai quelqu 'un
d'autre expliquer tout ca s'il a envie (de ce que j'en sais, c'est assez
primitif, cote getch et getche, et je soupconne que windows emule ce
comportement si on fait des appli texte en cochant la case "terminal").
Pour l'embarque, historiquement, c'est des implementations "freestanding" ,
donc la bibliotheque standard, dans l'ensemble, est remplacee par autre
chose qui va s'en rapprocher plus ou moins...
In article .com>,
wrote:
>Pour l'allocation dynamique, si je comprends bien que free est très
>utile pour libérer la mémoire et pour la saisie de caractères, ffl ush
>doit étre présent. Il n'y a pas beaucoup d'infos (j'ai pas beaucoup
>cherché) mais je peux lire que fflush vide le buffer. C'est un peu
>plus de sécurité alors?
Non, pas de soucis de securite. Je soupconne que tu fais une confusion
frequente: fflush() s'applique aux flux *en sortie*. Lorsque tu vois un
fflush sur une fonction qui interagit avec le clavier et l'ecran, fflush( )
est utilise pour forcer printf() "a afficher" quelque chose.
Par defaut, stdout est en mode "tampon par lignes completes", donc si tu
veux faire un truc tel que:
printf("Entrez un nombre ");
fflush(stdout);
scanf(...);
Ca va mal marcher sans le fflush, vu que printf n'est pas une ligne compl ete.
[sur certains systemes, ca va fonctionner quand meme. Car il existe un
autre langage, C++, qui lui va lier l'entree standard a la sortie standar d,
ce qui fait que toute operation d'entree provoque un flush... et parfois,
ca peut etre remonte jusqu'a la bibliotheque C, ce qui n'est pas interdit .]
De facon assez bizarre, *IL N'Y A PAS* d'equivalent standardise pour l'en tree
standard: tu ne peux pas gicler ce que l'utilisateur a tape "simplement" a
l'instant t ou tu fais une entree.
Si on est sur un systeme POSIX (e.g., Unix/Linux, pour simplifier), il y a
des moyens pour manipuler "proprement" l'entree standard (termios), mais ca
devient assez complexe, et il y plein de petits details a gerer. Dans le
monde DOS/Windows, c'est different. Je connais mal et je laisserai quelqu 'un
d'autre expliquer tout ca s'il a envie (de ce que j'en sais, c'est assez
primitif, cote getch et getche, et je soupconne que windows emule ce
comportement si on fait des appli texte en cochant la case "terminal").
Pour l'embarque, historiquement, c'est des implementations "freestanding" ,
donc la bibliotheque standard, dans l'ensemble, est remplacee par autre
chose qui va s'en rapprocher plus ou moins...
int main(void)
{
FILE *P_FILE = NULL ;
char Filename[FILENAMELENGH] ;
char Persname[PERSNAMELENGH] ;
int NbItems ;
printf("nnEnter the name of the file : n") ;
ReadUserString(Filename, FILENAMELENGH) ;
NbItems = ReadNumbOfItems(NUMMAXOFITEMS) ;
P_FILE = fopen(Filename, "w") ;
ReadAndSaveName(P_FILE, Persname, NbItems) ;
fclose(P_FILE) ;
P_FILE = fopen(Filename, "r") ;
DisplayFile(P_FILE) ;
fclose(P_FILE) ;
printf("nn") ;
return 0 ;
}
int ReadNumbOfItems(int nmax)
{
int n ;
printf("Enter the number of records : ") ;
scanf("%d", &n) ;
return n ;
}
Le programme se compile sans erreur ni avertissement.
Lors de l'exécution, arrivé à la question "Enter the number of
records : ", de la fonction ReadNumbOfItems, le nombre est bien lu
mais lorsque la fonction ReadAndSaveName intervient, ça saute le
premier enregistrement, on dirait que c'est 'n' qui traine
. Pourtant,
en supprimant la fonction ReadNumbOfItems, il n'y a plus ce problème.
Je pense que c'est scanf qui me pose un problème.
J'ai essayé
d'insérer fflush(stdout); entre printf("Enter the numbr of records:)
et scanf("%d",&n) sans succès.
D'après les explications sur fflush, je ne pense pas que le problème
vient de là mais ça me laisse perplexe car je ne m'attendais pas à
rencontrer une difficulté sur la saisie d'un entier avec scanf... Je
pense scanf est spécialement conçu pour ça?
int main(void)
{
FILE *P_FILE = NULL ;
char Filename[FILENAMELENGH] ;
char Persname[PERSNAMELENGH] ;
int NbItems ;
printf("nnEnter the name of the file : n") ;
ReadUserString(Filename, FILENAMELENGH) ;
NbItems = ReadNumbOfItems(NUMMAXOFITEMS) ;
P_FILE = fopen(Filename, "w") ;
ReadAndSaveName(P_FILE, Persname, NbItems) ;
fclose(P_FILE) ;
P_FILE = fopen(Filename, "r") ;
DisplayFile(P_FILE) ;
fclose(P_FILE) ;
printf("nn") ;
return 0 ;
}
int ReadNumbOfItems(int nmax)
{
int n ;
printf("Enter the number of records : ") ;
scanf("%d", &n) ;
return n ;
}
Le programme se compile sans erreur ni avertissement.
Lors de l'exécution, arrivé à la question "Enter the number of
records : ", de la fonction ReadNumbOfItems, le nombre est bien lu
mais lorsque la fonction ReadAndSaveName intervient, ça saute le
premier enregistrement, on dirait que c'est 'n' qui traine
. Pourtant,
en supprimant la fonction ReadNumbOfItems, il n'y a plus ce problème.
Je pense que c'est scanf qui me pose un problème.
J'ai essayé
d'insérer fflush(stdout); entre printf("Enter the numbr of records:)
et scanf("%d",&n) sans succès.
D'après les explications sur fflush, je ne pense pas que le problème
vient de là mais ça me laisse perplexe car je ne m'attendais pas à
rencontrer une difficulté sur la saisie d'un entier avec scanf... Je
pense scanf est spécialement conçu pour ça?
int main(void)
{
FILE *P_FILE = NULL ;
char Filename[FILENAMELENGH] ;
char Persname[PERSNAMELENGH] ;
int NbItems ;
printf("nnEnter the name of the file : n") ;
ReadUserString(Filename, FILENAMELENGH) ;
NbItems = ReadNumbOfItems(NUMMAXOFITEMS) ;
P_FILE = fopen(Filename, "w") ;
ReadAndSaveName(P_FILE, Persname, NbItems) ;
fclose(P_FILE) ;
P_FILE = fopen(Filename, "r") ;
DisplayFile(P_FILE) ;
fclose(P_FILE) ;
printf("nn") ;
return 0 ;
}
int ReadNumbOfItems(int nmax)
{
int n ;
printf("Enter the number of records : ") ;
scanf("%d", &n) ;
return n ;
}
Le programme se compile sans erreur ni avertissement.
Lors de l'exécution, arrivé à la question "Enter the number of
records : ", de la fonction ReadNumbOfItems, le nombre est bien lu
mais lorsque la fonction ReadAndSaveName intervient, ça saute le
premier enregistrement, on dirait que c'est 'n' qui traine
. Pourtant,
en supprimant la fonction ReadNumbOfItems, il n'y a plus ce problème.
Je pense que c'est scanf qui me pose un problème.
J'ai essayé
d'insérer fflush(stdout); entre printf("Enter the numbr of records:)
et scanf("%d",&n) sans succès.
D'après les explications sur fflush, je ne pense pas que le problème
vient de là mais ça me laisse perplexe car je ne m'attendais pas à
rencontrer une difficulté sur la saisie d'un entier avec scanf... Je
pense scanf est spécialement conçu pour ça?
int ReadNumbOfItems(int nmax)
{
int n ;
printf("Enter the number of records : ") ;
scanf("%d", &n) ;
return n ;
}
int ReadNumbOfItems(int nmax)
{
int n ;
printf("Enter the number of records : ") ;
scanf("%d", &n) ;
return n ;
}
int ReadNumbOfItems(int nmax)
{
int n ;
printf("Enter the number of records : ") ;
scanf("%d", &n) ;
return n ;
}