Se connecter avec
S'enregistrer | Connectez-vous

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

Dernière réponse : dans Programmation

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)
Lassé par la pub ? Créez un compte

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

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

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 ?

  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);

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

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.
Expert Programmation

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
Expert Programmation

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 :-)
Expert Programmation

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.
Expert Programmation

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

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:
Expert Programmation

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"...
Lassé par la pub ? Créez un compte
Tom's guide dans le monde