Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

scanf et getc

5 réponses
Avatar
Cohiba
J'aimerais lire une suite de doublet(int, char*) entree au clavier.
Dans ma boucle, je fait

1) scanf("%d", valeur);
pour lire l'entier

2) char * chaine; i = 0;
while((chaine[i]=getchar())!='\n')
i++;
pour lire ma chaine de caractere.

Cependant, ma chaine de caractere est toujours vide!
Quelle est mon erreur?

5 réponses

Avatar
Emmanuel Delahaye
Cohiba wrote on 20/12/04 :
J'aimerais lire une suite de doublet(int, char*) entree au clavier.
Dans ma boucle, je fait

1) scanf("%d", valeur);
pour lire l'entier

2) char * chaine; i = 0;
while((chaine[i]=getchar())!='n')
i++;
pour lire ma chaine de caractere.

Cependant, ma chaine de caractere est toujours vide!
Quelle est mon erreur?


scanf() n'est pas une fonction recommandée car difficile d'emploi.
L'alternative est fgets() avec les fonctions de conversions qui vont
bien...

Si tu y tiens, après un scanf(), il reste un 'n' dans stdin. Il faut
le sortir avec un getchar(), par exemple.

scanf("%d", valeur);
(void) getchar();

sinon, les getchar() suivant lit ce 'n', donc tu ne rentres même pas
dans la boucle.

Quelques idées:

http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"Mal nommer les choses c'est ajouter du malheur au
monde." -- Albert Camus.

Avatar
AG
Cohiba wrote:
J'aimerais lire une suite de doublet(int, char*) entree au clavier.
Dans ma boucle, je fait

1) scanf("%d", valeur);
pour lire l'entier

2) char * chaine; i = 0;
while((chaine[i]=getchar())!='n')
i++;
pour lire ma chaine de caractere.
Il te faut allouer de l'espace mémoire pour ta chaine.


par exemple, si tu es sur que la longueur de ta chaine ne dépasse pas 10
caractères :

char chaine[30]={0};

while(chaine[i]=getchar())!='n' && i<10) i++;

Avatar
jz
Cohiba wrote:
J'aimerais lire une suite de doublet(int, char*) entree au clavier.
Dans ma boucle, je fait

1) scanf("%d", valeur);
pour lire l'entier


scanf("%d", & valeur);

Il faut donner l'adresse de valeur (à moins que ta variable valeur
soit un pointeur vers un entier qui existe quelque part)

Comme le dit ED, se méfier de scanf qui est vicieuse, et en plus
l'utilisateur peut saisir autre chose qu'un entier juste pour t'embêter :(


2) char * chaine; i = 0;
while((chaine[i]=getchar())!='n')
i++;
pour lire ma chaine de caractere.


a) scanf(..) laisse un 'n' ;
b) chaine doit correspondre à une zone mémoire réservée, par un
tableau ou malloc.
c) Il ne faut pas déborder de cette zone mémoire.
d) Il faut ajouter '' pour marquer la fin de la chaîne lue.

Exemple vite fait, à adapter selon que tu veuilles ou non garder le
'n' final et réagir correctement si la saisie est trop longue :

#define TAILLE 100
char chaine[TAILLE];
int valeur;
int i=0;
scanf("%d", & valeur);
getchar(); /* pour virer 'n' */
while(i<TAILLE-1 && (chaine[i]=getchar())!='n'))
i++;
chaine[i] = '';

A+
Jacques

Avatar
Vincent Lefevre
Dans l'article ,
Emmanuel Delahaye écrit:

scanf() n'est pas une fonction recommandée car difficile d'emploi.
L'alternative est fgets() avec les fonctions de conversions qui vont
bien...


fgets() n'est pas si pratique que ça si on veut prendre en compte
les entrées tordues.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

Avatar
Emmanuel Delahaye
Vincent Lefevre wrote on 22/12/04 :
Dans l'article ,
Emmanuel Delahaye écrit:

scanf() n'est pas une fonction recommandée car difficile d'emploi.
L'alternative est fgets() avec les fonctions de conversions qui vont
bien...


fgets() n'est pas si pratique que ça si on veut prendre en compte
les entrées tordues.


Mais si, mais si!

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"