Se que scanf("%[^\n]",phrase) ; veux dire ??

Résolu
informatique_c Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
salut,
bon je veux savoir se que :
scanf("%[^\n]",&chaine) ;
scanf("%d%*[^\n]", &chaine);
veulent dire exactement (je connais leurs fonctionnalité ) se que je veux savoir c se que :
^
\n
[]
%
*
veulent dire dans ces lignes
mrc de me rependre...

2 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

scanf("%[^\n]",&chaine);
Le scanf stockera dans chaine tous les caractères jusqu'à ce que l'utilisateur appuie sur la touche entrée (\n). Cela permet notamment de récupérer des phrases (avec des espaces) contrairement à scanf("%s", ...);
Note : il faut mettre chaine, et non chaine (pas besoin de & pour les chaînes de caractères).

scanf("%d%*[^\n]", &chaine);
Le scanf stockera le nom en décimal signé dans chaine, puis ignorera tous les caractères situés après jusqu'à ce que l'utilisateur appuie sur la touche entrée (\n). Cela permet notamment de vider le buffer clavier.

Cdlt,
5
Hillian Fellers Messages postés 79 Date d'inscription   Statut Membre Dernière intervention   12
 
Merci pour les précisions, Fiddy
0
informatique_c Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   1
 
le problème avec ces deux la c que je ne peux pas utiliser scanf pour lire une chaine une autre foi dans le main , la deuxième elle vas être ignorer
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Oui, normal puisqu'avec scanf("%[^\n]",&chaine); il restera un '\n' dans le buffer clavier.
Il faut l'éliminer avant le prochain scanf().
Tu peux donc faire un getchar() juste avant.
Ou alors si tu veux cumuler le scanf() : scanf("%[^\n]%*c", chaine);
D'ailleurs, j'en profite pour rappeler que scanf() est dangereux comme fonction et qu'il faut à tout prix indiquer la taille de la chaîne pour éviter les désagréments.
Donc, ça serait même mieux de faire :
<code c>char toto[16]; scanf("%15[^\n]%*c", chaine)</code c>

D'ailleurs pour vider, le buffer c'est même mieux de se faire une fonction (boucle while jusqu'à trouver le '\n' ou EOF).

Un petit lien : http://fiddy.free.fr/blog/index.php?post/2008/11/22/Le-C%2C-pas-si-facile-que-%C3%A7a

Cdlt,
0
Hillian Fellers Messages postés 79 Date d'inscription   Statut Membre Dernière intervention   12
 
Bonsoir,

Des explications par exemple sur la page https://xrenault.developpez.com/tutoriels/c/scanf/
Et dans un tutoriel sur les expressions régulières (ou rationnelles): la séquence [] introduit une expression régulière.

Sauf erreur toujours possible (je n'ai pas pratiqué depuis très longtemps):

- scanf("%[^\n]",&chaine) ; récupère dans chaine tous les caractères jusqu'au premier new line (non inclus)

-scanf("%d%*[^\n]", &chaine); recherche d'abord un nombre (%d), l'ignore (%*) puis prend tous les caractères jusqu'au premier new line (non inclus).
1
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Presque bon.
%* s'applique ici à [^\n] et non à %d.
0
informatique_c Messages postés 30 Date d'inscription   Statut Membre Dernière intervention   1
 
mrc hillian fellers et mrc fiddy
0