Je viens de tester le fgets, et j'ai les même soucis.
[...]
Rep : 3
Entrer votre nom : Entrer votre prenom :
En gros, la première réponse, "nom" a été sauté, et il est directement
passé au prenom. Ensuite (adresse,tel, mail) ça se passe normalement. Où
est l'erreur??
Je viens de tester le fgets, et j'ai les même soucis.
[...]
Rep : 3
Entrer votre nom : Entrer votre prenom :
En gros, la première réponse, "nom" a été sauté, et il est directement
passé au prenom. Ensuite (adresse,tel, mail) ça se passe normalement. Où
est l'erreur??
Je viens de tester le fgets, et j'ai les même soucis.
[...]
Rep : 3
Entrer votre nom : Entrer votre prenom :
En gros, la première réponse, "nom" a été sauté, et il est directement
passé au prenom. Ensuite (adresse,tel, mail) ça se passe normalement. Où
est l'erreur??
Bon je vais essayer d'être plus clair et simple :
Si je tape 3, j'ai ça sur mon écran :
Rep : 3
Entrer votre nom : Entrer votre prenom : pascal
Entrer adresse : 20 rue
Entrer tel : 00000000
[..]
En gros, la première réponse, "nom" a été sauté, et il est directement passé
au prenom. Ensuite (adresse,tel, mail) ça se passe normalement. Où est
l'erreur??
Bon je vais essayer d'être plus clair et simple :
Si je tape 3, j'ai ça sur mon écran :
Rep : 3
Entrer votre nom : Entrer votre prenom : pascal
Entrer adresse : 20 rue
Entrer tel : 00000000
[..]
En gros, la première réponse, "nom" a été sauté, et il est directement passé
au prenom. Ensuite (adresse,tel, mail) ça se passe normalement. Où est
l'erreur??
Bon je vais essayer d'être plus clair et simple :
Si je tape 3, j'ai ça sur mon écran :
Rep : 3
Entrer votre nom : Entrer votre prenom : pascal
Entrer adresse : 20 rue
Entrer tel : 00000000
[..]
En gros, la première réponse, "nom" a été sauté, et il est directement passé
au prenom. Ensuite (adresse,tel, mail) ça se passe normalement. Où est
l'erreur??
J'ai essayé fgets, ça ne marche pas non plus. Il me saute le fgets :
printf("Entrer votre nom : ");//param est une struct qui contient les
champs nom, prenom etc...
fgets(param.nom, TAILLE_NOM, stdin);
et sur mon ecran j'ai ça :
**************************************
Agenda Répartie
**************************************
Choisissez le numéro :
1 - Lister les agendas disponibles
2 - Créer un agenda
3 - Insérer un contact
4 - Rechercher un contact
5 - Supprimer un contact
0 - Quitter le programme
Rep : 3
Entrer votre nom : Entrer votre prenom :
Et la je peux rentrer le reste des infos normalement(prenom, mail,
tel...), mais pour le nom, je n'ai rien rentré. Il est tout de suite
passé au prenom.
J'ai essayé fgets, ça ne marche pas non plus. Il me saute le fgets :
printf("Entrer votre nom : ");//param est une struct qui contient les
champs nom, prenom etc...
fgets(param.nom, TAILLE_NOM, stdin);
et sur mon ecran j'ai ça :
**************************************
Agenda Répartie
**************************************
Choisissez le numéro :
1 - Lister les agendas disponibles
2 - Créer un agenda
3 - Insérer un contact
4 - Rechercher un contact
5 - Supprimer un contact
0 - Quitter le programme
Rep : 3
Entrer votre nom : Entrer votre prenom :
Et la je peux rentrer le reste des infos normalement(prenom, mail,
tel...), mais pour le nom, je n'ai rien rentré. Il est tout de suite
passé au prenom.
J'ai essayé fgets, ça ne marche pas non plus. Il me saute le fgets :
printf("Entrer votre nom : ");//param est une struct qui contient les
champs nom, prenom etc...
fgets(param.nom, TAILLE_NOM, stdin);
et sur mon ecran j'ai ça :
**************************************
Agenda Répartie
**************************************
Choisissez le numéro :
1 - Lister les agendas disponibles
2 - Créer un agenda
3 - Insérer un contact
4 - Rechercher un contact
5 - Supprimer un contact
0 - Quitter le programme
Rep : 3
Entrer votre nom : Entrer votre prenom :
Et la je peux rentrer le reste des infos normalement(prenom, mail,
tel...), mais pour le nom, je n'ai rien rentré. Il est tout de suite
passé au prenom.
Et quelle est la fonction qui n'est pas montrée ici et qui sert à prendre la
réponse (ici 3) dans l'entrée standard, et y laisse un 'n' dedans ?? En
gros, la gestion du menu pose le même problème que tout à l'heure à mon
avis, quand tu prends le 3 tu tapes sur ton clavier '3' 'n' et ca laisse
le 'n' que fgets() se charge de prendre pour lui et pour sa fin de
chaine !
Et quelle est la fonction qui n'est pas montrée ici et qui sert à prendre la
réponse (ici 3) dans l'entrée standard, et y laisse un 'n' dedans ?? En
gros, la gestion du menu pose le même problème que tout à l'heure à mon
avis, quand tu prends le 3 tu tapes sur ton clavier '3' 'n' et ca laisse
le 'n' que fgets() se charge de prendre pour lui et pour sa fin de
chaine !
Et quelle est la fonction qui n'est pas montrée ici et qui sert à prendre la
réponse (ici 3) dans l'entrée standard, et y laisse un 'n' dedans ?? En
gros, la gestion du menu pose le même problème que tout à l'heure à mon
avis, quand tu prends le 3 tu tapes sur ton clavier '3' 'n' et ca laisse
le 'n' que fgets() se charge de prendre pour lui et pour sa fin de
chaine !
Et quelle est la fonction qui n'est pas montrée ici et qui sert à prendre
la réponse (ici 3) dans l'entrée standard, et y laisse un 'n' dedans ??
En gros, la gestion du menu pose le même problème que tout à l'heure à
mon avis, quand tu prends le 3 tu tapes sur ton clavier '3' 'n' et ca
laisse le 'n' que fgets() se charge de prendre pour lui et pour sa fin
de chaine !
Ton dernier post, je n'ai pas compris ton dernier paragraphe...
Pour récupérer le choix de ma réponse dans le switch, je faisais
auparavant un scanf (le dernier et seul scanf que j'ai laissé puisque je
ne pouvais pas le remplacer par un fgets puisque c'est normalement un
chiffre que l'utilisateur rentre, et donc un caractère et non une chaine
de caractère).
Les problèmes que j'ai eu, c'est ce que je vous ai déja dit : il me
sautais la première question (demande de nom) et allait directement à
prenom.
J'ai changé ce scanf par un fgetc. Et maintenant, je ne peux même plus
rentrer les nom, prenom, adresse etc... C'est affiché rapidement, mais
je ne peux pas y répondre.
Pour les plus déterminé, j'ai mis mon code de ma fonction principale en
entier ci dessous :
void interface(char *host)
{
int rep;
int *result;
info param;
CLIENT *clnt;
char c;
rep = -1;
//établie la connexion avec le serveur "host"
clnt = clnt_create (host, AGENDA, VERSION_UN, "udp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
param = login(clnt);
while (rep != 0)
{
system("clear");
printf("**************************************n");
printf(" Agenda Répartien");
printf("**************************************n");
printf("Choisissez le numéro :n");
printf("1 - Lister les agendas disponiblesn");
printf("2 - Créer un agendan");
printf("3 - Insérer un contactn");
printf("4 - Rechercher un contactn");
printf("5 - Supprimer un contactnn");
printf("0 - Quitter le programmenn");
printf("Rep : ");
fflush(stdin);
rep = getc(stdin);
switch (rep)
{
case 1 :
Et quelle est la fonction qui n'est pas montrée ici et qui sert à prendre
la réponse (ici 3) dans l'entrée standard, et y laisse un 'n' dedans ??
En gros, la gestion du menu pose le même problème que tout à l'heure à
mon avis, quand tu prends le 3 tu tapes sur ton clavier '3' 'n' et ca
laisse le 'n' que fgets() se charge de prendre pour lui et pour sa fin
de chaine !
Ton dernier post, je n'ai pas compris ton dernier paragraphe...
Pour récupérer le choix de ma réponse dans le switch, je faisais
auparavant un scanf (le dernier et seul scanf que j'ai laissé puisque je
ne pouvais pas le remplacer par un fgets puisque c'est normalement un
chiffre que l'utilisateur rentre, et donc un caractère et non une chaine
de caractère).
Les problèmes que j'ai eu, c'est ce que je vous ai déja dit : il me
sautais la première question (demande de nom) et allait directement à
prenom.
J'ai changé ce scanf par un fgetc. Et maintenant, je ne peux même plus
rentrer les nom, prenom, adresse etc... C'est affiché rapidement, mais
je ne peux pas y répondre.
Pour les plus déterminé, j'ai mis mon code de ma fonction principale en
entier ci dessous :
void interface(char *host)
{
int rep;
int *result;
info param;
CLIENT *clnt;
char c;
rep = -1;
//établie la connexion avec le serveur "host"
clnt = clnt_create (host, AGENDA, VERSION_UN, "udp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
param = login(clnt);
while (rep != 0)
{
system("clear");
printf("**************************************n");
printf(" Agenda Répartien");
printf("**************************************n");
printf("Choisissez le numéro :n");
printf("1 - Lister les agendas disponiblesn");
printf("2 - Créer un agendan");
printf("3 - Insérer un contactn");
printf("4 - Rechercher un contactn");
printf("5 - Supprimer un contactnn");
printf("0 - Quitter le programmenn");
printf("Rep : ");
fflush(stdin);
rep = getc(stdin);
switch (rep)
{
case 1 :
Et quelle est la fonction qui n'est pas montrée ici et qui sert à prendre
la réponse (ici 3) dans l'entrée standard, et y laisse un 'n' dedans ??
En gros, la gestion du menu pose le même problème que tout à l'heure à
mon avis, quand tu prends le 3 tu tapes sur ton clavier '3' 'n' et ca
laisse le 'n' que fgets() se charge de prendre pour lui et pour sa fin
de chaine !
Ton dernier post, je n'ai pas compris ton dernier paragraphe...
Pour récupérer le choix de ma réponse dans le switch, je faisais
auparavant un scanf (le dernier et seul scanf que j'ai laissé puisque je
ne pouvais pas le remplacer par un fgets puisque c'est normalement un
chiffre que l'utilisateur rentre, et donc un caractère et non une chaine
de caractère).
Les problèmes que j'ai eu, c'est ce que je vous ai déja dit : il me
sautais la première question (demande de nom) et allait directement à
prenom.
J'ai changé ce scanf par un fgetc. Et maintenant, je ne peux même plus
rentrer les nom, prenom, adresse etc... C'est affiché rapidement, mais
je ne peux pas y répondre.
Pour les plus déterminé, j'ai mis mon code de ma fonction principale en
entier ci dessous :
void interface(char *host)
{
int rep;
int *result;
info param;
CLIENT *clnt;
char c;
rep = -1;
//établie la connexion avec le serveur "host"
clnt = clnt_create (host, AGENDA, VERSION_UN, "udp");
if (clnt == NULL) {
clnt_pcreateerror (host);
exit (1);
}
param = login(clnt);
while (rep != 0)
{
system("clear");
printf("**************************************n");
printf(" Agenda Répartien");
printf("**************************************n");
printf("Choisissez le numéro :n");
printf("1 - Lister les agendas disponiblesn");
printf("2 - Créer un agendan");
printf("3 - Insérer un contactn");
printf("4 - Rechercher un contactn");
printf("5 - Supprimer un contactnn");
printf("0 - Quitter le programmenn");
printf("Rep : ");
fflush(stdin);
rep = getc(stdin);
switch (rep)
{
case 1 :
Jean-Marc wrote on 02/11/04 :scanf, fscanf et sscanf sont pratiques pour lire des données
formattées, par exemple pour lire des données dans un fichier
dont on connait avec certitude la structure (parce qu'on l'a
écrit soi même par exemple).
Et encore... Il vaut parfois mieux passer par fgets(), puis sscanf().
De toutes façons, il faut tester le code retour de *scanf() (nombre de
conversions réussies).
Jean-Marc wrote on 02/11/04 :
scanf, fscanf et sscanf sont pratiques pour lire des données
formattées, par exemple pour lire des données dans un fichier
dont on connait avec certitude la structure (parce qu'on l'a
écrit soi même par exemple).
Et encore... Il vaut parfois mieux passer par fgets(), puis sscanf().
De toutes façons, il faut tester le code retour de *scanf() (nombre de
conversions réussies).
Jean-Marc wrote on 02/11/04 :scanf, fscanf et sscanf sont pratiques pour lire des données
formattées, par exemple pour lire des données dans un fichier
dont on connait avec certitude la structure (parce qu'on l'a
écrit soi même par exemple).
Et encore... Il vaut parfois mieux passer par fgets(), puis sscanf().
De toutes façons, il faut tester le code retour de *scanf() (nombre de
conversions réussies).
Ensuite pour demander le nom, scanf est peut sécurisé tout de même, car tu
peux rentrer 42 caractères alors que seulement 20 sont reservés, et la
pouf...
Donc préferer fgets() :
fgets(nom, NOMBRE_DE_CARACTERE_MAX, stdin);
ca c'est sûrement parce que scanf a un comportement « merdique ». En effet,
si tu fais ceci :
int nombre, char caractere;
printf("Entrez le nombren");
scanf("%d", &nombre);
printf("Entrez le caractèren");
scanf("%c", &caractere);
tu vas avoir la surprise que le caractère est sauté (de même pour une chaine
dans ton cas).
Pourquoi ? et bien parce que scanf a laissé le caractère 'n' qui est tapé
derrière le nombre pour valider la première saisie, et quand il regarde
l'entrée standard il va retrouver ce caractère et le prendre pour la saisie
d'après. Conclusion il va « ignorer » (du point de vue de l'utilisateur) la
saisie d'après :-)
Une solution pour éviter ceci (si tu persistes et/ou est obligé d'utiliser
scanf()) est de vider le buffer d'entrée après toute saisie avec scanf() :
while(fgetc(stdin) != 'n');
Ensuite pour demander le nom, scanf est peut sécurisé tout de même, car tu
peux rentrer 42 caractères alors que seulement 20 sont reservés, et la
pouf...
Donc préferer fgets() :
fgets(nom, NOMBRE_DE_CARACTERE_MAX, stdin);
ca c'est sûrement parce que scanf a un comportement « merdique ». En effet,
si tu fais ceci :
int nombre, char caractere;
printf("Entrez le nombren");
scanf("%d", &nombre);
printf("Entrez le caractèren");
scanf("%c", &caractere);
tu vas avoir la surprise que le caractère est sauté (de même pour une chaine
dans ton cas).
Pourquoi ? et bien parce que scanf a laissé le caractère 'n' qui est tapé
derrière le nombre pour valider la première saisie, et quand il regarde
l'entrée standard il va retrouver ce caractère et le prendre pour la saisie
d'après. Conclusion il va « ignorer » (du point de vue de l'utilisateur) la
saisie d'après :-)
Une solution pour éviter ceci (si tu persistes et/ou est obligé d'utiliser
scanf()) est de vider le buffer d'entrée après toute saisie avec scanf() :
while(fgetc(stdin) != 'n');
Ensuite pour demander le nom, scanf est peut sécurisé tout de même, car tu
peux rentrer 42 caractères alors que seulement 20 sont reservés, et la
pouf...
Donc préferer fgets() :
fgets(nom, NOMBRE_DE_CARACTERE_MAX, stdin);
ca c'est sûrement parce que scanf a un comportement « merdique ». En effet,
si tu fais ceci :
int nombre, char caractere;
printf("Entrez le nombren");
scanf("%d", &nombre);
printf("Entrez le caractèren");
scanf("%c", &caractere);
tu vas avoir la surprise que le caractère est sauté (de même pour une chaine
dans ton cas).
Pourquoi ? et bien parce que scanf a laissé le caractère 'n' qui est tapé
derrière le nombre pour valider la première saisie, et quand il regarde
l'entrée standard il va retrouver ce caractère et le prendre pour la saisie
d'après. Conclusion il va « ignorer » (du point de vue de l'utilisateur) la
saisie d'après :-)
Une solution pour éviter ceci (si tu persistes et/ou est obligé d'utiliser
scanf()) est de vider le buffer d'entrée après toute saisie avec scanf() :
while(fgetc(stdin) != 'n');
En , Emmanuel Delahaye va escriure:Jean-Marc wrote on 02/11/04 :scanf, fscanf et sscanf sont pratiques pour lire des données
formattées, par exemple pour lire des données dans un fichier
dont on connait avec certitude la structure (parce qu'on l'a
écrit soi même par exemple).
Et encore... Il vaut parfois mieux passer par fgets(), puis sscanf().
Pas d'accord.
Si tu relis un fichier que tu as toi-même créé (enfin, le même programme),
il n'y a pas de raison pour que tu aies des incidents ou des débordements.
Bien sûr, avoir un numéro de version, ou bien le locale, au début pour un
fichier « pas trop vivant » ne fait pas forcément du mal (et ceux-là, il
vaut mieux les lire avec fgets et sscanf, quite à faire un rewind après).
Mais sinon, en général, fgets va consommer de la mémoire sans apporter grand
chose d'autre que de rassurer le programmeur ou le mainteneur (ce qui n'est
pas forcément à dédaigner).
En mn.14f97d4b531584f8.15512@YOURBRAnoos.fr, Emmanuel Delahaye va escriure:
Jean-Marc wrote on 02/11/04 :
scanf, fscanf et sscanf sont pratiques pour lire des données
formattées, par exemple pour lire des données dans un fichier
dont on connait avec certitude la structure (parce qu'on l'a
écrit soi même par exemple).
Et encore... Il vaut parfois mieux passer par fgets(), puis sscanf().
Pas d'accord.
Si tu relis un fichier que tu as toi-même créé (enfin, le même programme),
il n'y a pas de raison pour que tu aies des incidents ou des débordements.
Bien sûr, avoir un numéro de version, ou bien le locale, au début pour un
fichier « pas trop vivant » ne fait pas forcément du mal (et ceux-là, il
vaut mieux les lire avec fgets et sscanf, quite à faire un rewind après).
Mais sinon, en général, fgets va consommer de la mémoire sans apporter grand
chose d'autre que de rassurer le programmeur ou le mainteneur (ce qui n'est
pas forcément à dédaigner).
En , Emmanuel Delahaye va escriure:Jean-Marc wrote on 02/11/04 :scanf, fscanf et sscanf sont pratiques pour lire des données
formattées, par exemple pour lire des données dans un fichier
dont on connait avec certitude la structure (parce qu'on l'a
écrit soi même par exemple).
Et encore... Il vaut parfois mieux passer par fgets(), puis sscanf().
Pas d'accord.
Si tu relis un fichier que tu as toi-même créé (enfin, le même programme),
il n'y a pas de raison pour que tu aies des incidents ou des débordements.
Bien sûr, avoir un numéro de version, ou bien le locale, au début pour un
fichier « pas trop vivant » ne fait pas forcément du mal (et ceux-là, il
vaut mieux les lire avec fgets et sscanf, quite à faire un rewind après).
Mais sinon, en général, fgets va consommer de la mémoire sans apporter grand
chose d'autre que de rassurer le programmeur ou le mainteneur (ce qui n'est
pas forcément à dédaigner).
Laisse tomber scanf(). Pas une fonction de débutant (ni même
d'expérimenté...)
Laisse tomber scanf(). Pas une fonction de débutant (ni même
d'expérimenté...)
Laisse tomber scanf(). Pas une fonction de débutant (ni même
d'expérimenté...)