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

Résolu/Fermé
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 - 10 sept. 2014 à 23:42
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 12 sept. 2014 à 13:36
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
11 sept. 2014 à 10:37
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 mardi 22 octobre 2013 Statut Membre Dernière intervention 24 mai 2022 12
12 sept. 2014 à 01:04
Merci pour les précisions, Fiddy
0
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
Modifié par informatique_c le 12/09/2014 à 02:41
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
12 sept. 2014 à 13:36
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 mardi 22 octobre 2013 Statut Membre Dernière intervention 24 mai 2022 12
11 sept. 2014 à 00:04
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
11 sept. 2014 à 10:32
Presque bon.
%* s'applique ici à [^\n] et non à %d.
0
informatique_c Messages postés 30 Date d'inscription mardi 22 juillet 2014 Statut Membre Dernière intervention 17 mars 2016 1
12 sept. 2014 à 02:39
mrc hillian fellers et mrc fiddy
0