Votre question

[RESOLU] Quel fonction, comme scanf, prend en charge les espaces ?

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
13 Février 2006 18:35:31

Bonjour à tous !

Dans un programme quand on met un scanf pour une chaine de caractère, dès qu'on met un espace, le mot qui suivra sera affecté à la variable qui suit !

C'est arrangeant quelque fois mais c'est enrageant des fois aussi !!!

Dans mon programme, je demande l'adresse de l'utilisateur et une adresse, sa peut prendre 3, 4, 5... mots !

Donc il me faudrait une fonction comme scanf qui prend en compte les espace dans la même chaine de caractères.

Vous pouvez me la donnée ?
(svp, expliquez-moi comment on s'en sert également)

Autres pages sur : resolu fonction scanf prend charge espaces

13 Février 2006 18:43:45

ta essayé avec:
  1. scanf("%c", &......)

?
13 Février 2006 18:49:20

%c = caractère

Il me faut une fonction qui gère les chaines de caractère avec des espaces.

%s = chaines de caractères
  1. (...)
  2. scanf("%s %s", &mot1, &mot2);
  3. (..)

Si je tappe "Bonjour Sliv" :
mot1 = Bonjour
mot2 = Sliv


Contenus similaires
13 Février 2006 18:50:45

ben met qu'un seul %s (bon je parle mais jy connai pas gran chose)
13 Février 2006 18:53:26

Si je met qu'un seul %s alors :
Citation :

scanf("%s", mot1);


Je tappe "Salut Sliv"

>>> mot1 vaudra "Salut"
a b L Programmation
13 Février 2006 19:18:35

Et bien fais un gets(buffer); ;-)
13 Février 2006 19:46:50

Explique-moi comment on utilise cette fonction stp
:-?
13 Février 2006 20:43:44

ok merci à toi !
14 Février 2006 11:27:44

Sois tu utilises gets et sscanf par derrière.
Ou alors tu utilises fgets(chaine,longueurMax,stdin);
14 Février 2006 15:36:51

scanf("%[^\n]", mot);

Ca prend toute la ligne.
14 Février 2006 17:06:58

Ok merci je vais essayé tout ça.
;-)
14 Février 2006 17:54:24

J'ai essayé et ça marche pas !
le programme ne s'arrete pas pour que l'utilisateur entre quelque chose.

Quelqu'un peut me donner un exemple complet,
avec un tableau de type char de taille 200 nommé "adresse" ?

Ah oui j'oubliais !
J'aimerais une fonction qui écrit dans un fichier, avec un exemple.

s'il vous plait ! :-D

14 Février 2006 18:51:31

montre ton code
14 Février 2006 19:45:59

ben y'en a pas !
J'aimerais qu'on m'explique comment on utilise cette fonction par un exemple.
14 Février 2006 19:59:45

Euh c'est pas compliqué de chercher un petit peu mais bon comme je suis gentil :

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAILLEMAX 200;
  4.  
  5. int main(void)
  6. {
  7. char maChaine[TAILLEMAX];
  8. printf("Entrez une donnee\n");
  9. fgets(maChaine,TAILLEMAX,stdin);
  10. printf("Vous avez saisi: %s\n",maChaine);
  11. getchar();
  12. return 0;
  13. }


Pour écrire dans les fichiers renseigne toi sur la structure FILE ainsi que les fonction fopen, fwrite et fseek
14 Février 2006 20:16:58

Je comprend pas :

Voilà ce que j'ai mis :
  1. char adresse[200];
  2.  
  3. printf("\n (I) Entrez votre numero de rue et son nom :\n"
  4. " Exemple : 3 rue des oiseaux\n"
  5. " Votre rue : \n");
  6. fgets(adresse,200,stdin);


Et il saute le fgets et va au scanf qui suit.

Tu peux m'aider ?
14 Février 2006 20:39:14

Montre ton code en entier
14 Février 2006 20:44:55

  1. char nom[100], prenom[100], adresse[200],codePostal[100], Ville[100];
  2. system("CLS");
  3. printf(" (I) Entrez votre nom en majuscule, puis votre prenom :\n"
  4. " Exemple : DUPOND George\n"
  5. " Votre nom et votre prenom : ");
  6. scanf("%s %s", &nom, &prenom);
  7.  
  8. printf("\n (I) Entrez votre numero de rue et son nom :\n"
  9. " Exemple : 3 rue des oiseaux\n"
  10. " Votre rue : \n");
  11. fgets(adresse,200,stdin);
  12.  
  13.  
  14. printf("\n (I) Entrez votre code postal suivi de votre ville :\n"
  15. " Exemple : 75000 Paris\n"
  16. " Votre code postal et votre ville : ");
  17. scanf("%s %s", &codePostal, &Ville);
14 Février 2006 20:56:24

Hum dans ton cas une structure serait plus appropriée :

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct {
  5. char nom[100];
  6. char prenom[200];
  7. char adresse[200];
  8. char codePostal[200];
  9. char ville[200];
  10. } infoPersonne ;
  11.  
  12. int main(void)
  13. {
  14. infoPersonne infos;
  15. printf("Entrez votre nom en MAJUSCULE\n");
  16. fgets(infos.nom,200,stdin);
  17. printf("Entre votre prenom\n");
  18. fgets(infos.prenom,200,stdin);
  19. printf("Entrez votre adresse\n");
  20. fgets(infos.adresse,200,stdin);
  21. printf("Entrez votre code postal\n");
  22. fgets(infos.codePostal,200,stdin);
  23. printf("Entrez votre ville\n");
  24. fgets(infos.ville,200,stdin);
  25. getchar();
  26. return 0;
  27. }


Mais si tu ne connais pas encore les structures, un petit truc: lorsque tu utilises %s dans scanf ne met pas de &
scanft("%s",chaine);

car chaine est un pointeur en fait
14 Février 2006 21:03:31

Merci de m'avoir aidé.

En effet, je ne connais pas encore les structure.

Et si j'enleve les & sa marchera ?
14 Février 2006 21:07:04

Essaye mais pour le futur ne le met pas
15 Février 2006 20:03:27

Sa marche pas ! :-(

Pourquoi ça marche pas !!! :hein:




PS : je n'ai pas mis de structure mais j'ai enlevé tous les &
15 Février 2006 20:10:31

Qu'est ce que ca te donne exactement?
15 Février 2006 20:20:24

il ne fais rien !

Il affiche "Votre rue :"
(fonction du printf)

Et il ne sarrete pas et affichie le reste :
"(I) Entrez votre code postal suivi de votre ville :
Exemple : 75000 Paris
Votre code postal et votre ville : "

et la il met le scanf normalement.
15 Février 2006 20:56:34

Essaye de mettre un fflush(stdin); après chaque instruction ou tu demande quelquechose à l'utilisateur (c-a-d scanf(); ou fgets();). Ca va vider stdin.
Jte garantis rien, mais ca peux marcher...
Ps:ya pas de faute a fflush(); tu peux verifier dans stdio.h si tu me crois pas... :-D
15 Février 2006 21:54:36

Citation :

Rakipu a écrit :
Ps:ya pas de faute a fflush(); tu peux verifier dans stdio.h si tu me crois pas... :-D

pourquoi y'aurait une faute ? :-o
15 Février 2006 22:57:18

ca marche pas scanf("%[^\n]", str); ?
15 Février 2006 23:02:02

@Ritzle:Il pourrait penser que j'ai tapé deux fois le f de fflush(); ;-)

@bluedylc: chépa, jamais essayé...
16 Février 2006 09:48:32

Bah c'est bizarre. Il a un problème, je donne une solution, et toi tu proposes un mix infame de fgets et de scanf, bourré de flush, sans regarder ce que les autres proposent.

aerocell > tu pourrais nous poster ton code en entier ?
16 Février 2006 16:54:16

C'est bon les gars ! ça marche ! ;-)

J'ai mis un fflush(stdin); après tous les scanf et fgets, comme me la proposé Rakipu.

Merci à vous !

Mais c'est quoi au juste ce "stdin" qu'on rempli et qu'on vide ? :-?
16 Février 2006 18:32:17

stdin c'est un flux qui reçoit ce que tu entre au clavier.
Il te sert donc de tampon, où tu garde ces entrées avant de les utiliser.
Ce qui peut arriver, c'est que après un scanf ou autre, un '\n' est entré dans le tampon par l'utilisatuer (quand il appuie sur entrée), et donc au scanf suivant, il est utilisé et le programme passe a la suite des instructions.
(Bon c'est un peu confus tout ca et je te garantis pas l'absence d'erreurs, si tu veux en savoir plus cherche su google...)

@bluedylc:
Citation :
Bah c'est bizarre. Il a un problème, je donne une solution, et toi tu proposes un mix infame de fgets et de scanf, bourré de flush, sans regarder ce que les autres proposent.

lol, t'énerve pas hein... C'est pas mon mix hein, je vois son code, je lui propose une solution... Apres il en fait ce qu'il veut :-D
Euh sinon pour ton truc, toi tu as testé si ca marche? Je sais qu'il existe une méthode similaire en bash, mais je savais pas que ca existait en C... C'est toujours interessant d'avoir d'autres méthodes :-)
16 Février 2006 19:45:54

ok merci ;-)
16 Février 2006 20:42:20

Juste un truc, c'est mauvais d'utiliser stdin sur fflush car ça a un comportement non déterminé indefini dans le standart
16 Février 2006 20:46:20

ah bon ?

Qu'est ce que tu entends par "comportement non déterminé" ?
16 Février 2006 20:57:59

Oui, bonne question... J'espère que c'est pas dangereux? lol
Sinon pour te débarasser du '\n' tu peux, je crois, utiliser scanf("%*c"); ce qui consommera un caractère et te permettra de t'en débarasser sans l'utiliser.
16 Février 2006 21:22:39

Bon... A ce qu'il parait, faudrait en théorie pas utiliser scanf non plus... parce que c'est pas propre et que ca laisse des trucs dans stdin.
Tu peux faire un getchar(); pour consommer le caractère. Mais c'est toujours pas propre.
...

Sinon, pour fflush(stdin); il semblerait que le comportement de vider stdin ne soit pas standard (apres une recherche sur google :-) ), mais que cette fonctionnalité ait été implémentée sur certains (la plupart?) des compilateurs.

A cette adresse: http://c-faq.com/stdio/gets_flush2.html
tu trouvera plus d'informations, et ils conseillent d'abandonner scanf ou de l'utiliser seul... Enfin bref...

Tout ca c'est pour si tu veux programmer "proprement" :-D
Si t'en a rien a faire (mais tu t'en préoccupe, hein?tu veux pas travailler pour Microsoft j'espère...), tu peux passer plus ou moins outre (je te le conseille pas lol)

@Tebonb:Merci, tu m'a apris un truc interessant :-D
17 Février 2006 07:51:18

Je voudrais pas faire mon relou ^^, mais moi je te propose de faire tout en scanf avec
scanf("%[^\n]", str);, mais si tu veux mixer avec d'autres trucs utilise plutot
scanf("%[^\n]%*c", str);
17 Février 2006 17:22:55

ok ok ok. :-D

Moi perso maintenant je met toujours un fflush(stdin); avant et apres chaque scanf ou fgets.
Comme ça, stdin est censé être vidé, non ?

Depuis que vous m'avez appris à me servir de fgets, je l'utilise pour toutes mes saisies de chaines de caratères par l'utilisateur et j'utlise scanf pour les nombre.

Mon programme est censé être propre là, non ? :-?

A Rakipu : Non, je ne travaillerais JAMAIS pour MS !!! :nono:

MS :p an:
17 Février 2006 19:27:38

Citation :
Mon programme est censé être propre là, non ?

Ben en fait, le problème c'est l'instruction fflush(stdin);
Sur un compilateur qui respecterait juste la norme du C, fflsuh(stdin); possède un "comportement indéfini" donc ca ne marcherait pas...
Donc le code n'est pas complètement "portable", et ca, c'est pas "propre"...
17 Février 2006 19:39:55

ce qui est sûr c'est que dev et code::block le supporte car j'ai déja déclaré un tableau de la taille d'une variable (ce qui est normalement interdit) et il n'a rien dit.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS