[C] Aide sur scanf

Aide sur scanf [C] - Programmation

Marsh Posté le 22-12-2001 à 16:53:45    

Comment fait-on pour stocker une entrée avec des espaces dans une chaîne.
 
Exemple
Je tape : "Bonjour tout le monde"
scanf(...,txt);
Et je voudrais retrouvé : "Bonjour tout le monde" dans txt et pas seulement "Bonjour".

Reply

Marsh Posté le 22-12-2001 à 16:53:45   

Reply

Marsh Posté le 22-12-2001 à 16:57:54    

Peux-tu utiliser les string (C++)?

Reply

Marsh Posté le 22-12-2001 à 17:00:15    

non seulement en C et sans créer sa fonction ...

Reply

Marsh Posté le 22-12-2001 à 17:12:00    

ben scanf("%s",txt);
 
 
char txt[22+1]  // +1 car \0 de fin de chaine et 22 pour le reste

Reply

Marsh Posté le 22-12-2001 à 17:15:19    

Ben justement non scanf("%s",txt) ne marche pas il ne renvoie seulement que "Bonjour"

Reply

Marsh Posté le 22-12-2001 à 17:18:50    

#include <stdio.h>
 
main()
{
char text[21];
 
printf("texte:" );
gets(text);
 
printf("%s",text);
}
 
voila ça sa tourne

Reply

Marsh Posté le 23-12-2001 à 15:05:26    

il est débutant, il ne doit pas connaître les "gets"
(remarque, je suis dans le même cas)
 
tu oublies le "&"
 
scanf("%c", &texte);


---------------
If you really want something, all the Universe conspires in helping you to achieve it.
Reply

Marsh Posté le 23-12-2001 à 15:12:37    

oui effectivement le gets prends toute la ligne espace compris le scanf s'arrete a l'espace sinon une autre solution etait un while avec un getchar mais ta pas le droit de creer e fonction ;(

Reply

Marsh Posté le 23-12-2001 à 15:22:09    

question à 5 balles :
dans un programme, on demande à l'utilisateur d'entrer un certain chiffre.  La commande qui suit est scanf("%d",[nom]);
Si on met une lettre à la place d'un chiffre, le programme bugge(plein de chiffres défilent à l'écran).
 
Y'a moyen d'éviter ça ?


---------------
If you really want something, all the Universe conspires in helping you to achieve it.
Reply

Marsh Posté le 23-12-2001 à 16:42:08    

Eniac a écrit a écrit :

question à 5 balles :
dans un programme, on demande à l'utilisateur d'entrer un certain chiffre.  La commande qui suit est scanf("%d",[nom]);
Si on met une lettre à la place d'un chiffre, le programme bugge(plein de chiffres défilent à l'écran).
 
Y'a moyen d'éviter ça ?  




ce que je faisais :
ne prendre que des char , quitte a eventuellement les convertir en chiffre après

Reply

Marsh Posté le 23-12-2001 à 16:42:08   

Reply

Marsh Posté le 24-12-2001 à 09:30:30    

Pour scanner une ligne qui contient des espaces, scanf convient parfaitement : mais il faut connaitre l'astuce qui tue !
La ligne que tu as tapée au clavier est stockée dans un tampon. scanf va te renvoyer tous les caractères jusqu'au premier caractère séparateur... mais le reste du texte est toujours dans le tampon, il suffit de refaire d'autres scanf derrière pour le récupérer :
 
char temp[80];
 
do
{
   scanf("%s",temp);
}while(temp[0]!='\0';); // je suis pas sûr de la condition de sortie !
 
... et chaque exécution de la boucle te donne le mot suivant dans le tampon.

Reply

Marsh Posté le 24-12-2001 à 14:12:57    

fgets(buf, "%s", 255) si je me gourre pas.
Et pour les char * y a pas besoin d'un & puisque le nom du char * est deja un pointeur vers le 1er element du tableau


---------------
Super.
Reply

Marsh Posté le 25-12-2001 à 01:53:53    

petit rappel :
http://www.lri.fr/~aze/page_c/aide_c/scanf.html
 
si ta chaine est saisie dans la console, elle se termine par "\n"
donc toi tu veux lire tous les caractères autres que "\n"
donc :

Code :
  1. scanf("%[^\n]", chaine);


et sans le & comme quelqu'un a dit (chaine est un pointeur)
 
pour lire que des chiffres, je pense que c'est un peu plus complexe
moi je ferais :
filtrer tous les chiffres dans un buffer

Code :
  1. scanf("%[0-9]", buffer);


convertir ce buffer en nombre

Code :
  1. sscanf(buffer, "%d", &nombre);


ca c'est vite fait
si le mec rentre des lettres, scanf va s'arreter et la prochaine lecture ce sera des lettres
on peut donc rajouter un

Code :
  1. fflush(stdin);

apres notre scanf.
 
Cela dit, je pense que ca tient surtout de la manière dont scanf est implémenté. Perso,

Code :
  1. scanf("%d", &n);

(Borland) testé en entrant "123abc"  me renvoit "123" sans planter ...
mais un

Code :
  1. fflush(stdin);

est nécessaire ("abc" reste)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 25-12-2001 à 12:09:10    

J'y comprend rien :)
 
Je (on ?) suis débutant en C, j'ai pas encore vu ce qu'étaient les chaînes, les pointeurs, comment fonctionnent les buffers,etc...
 
Tout ce qu'on m'a dit (et j'ai un bouquin qui le confirme) c'est de toujours mettre un & devant le nom de la variable, je sais même pas à quoi ça sert, je pensais bêtement que c'était la syntaxe (si au passage tu pouvais m'expliquer je dirais pas non :) )
 
A+


---------------
If you really want something, all the Universe conspires in helping you to achieve it.
Reply

Marsh Posté le 25-12-2001 à 19:48:04    

un pointeur, c'est comme une adresse internet : c'est un lien
un pointeur, c'est pas une adresse de site mais une adresse mémoire.
un lien, ca peut être un lien vers une image, un site, du texte, un exe, un forum ...
un pointeur c'est pareil : ca peut pointer sur tout, mais ca reste une simple adresse mémoire = un nombre
un pointeur sur un entier et un pointeur sur une chaine de caractere sont tous les deux des nombres = des adresses de 32 bits ici
 
pour obtenir l'adresse d'une variable, il faut utiliser l'opérateur &
 
fait

Code :
  1. printf("%X", &nombre);


et tu verra s'afficher (en hexadecimal) l'adresse de ta variable
c.a.d l'endroit ou elle se trouve dans ta RAM (en gros)
 
scanf a besoin des adresses des variables qui doivent recevoir les valeurs lues

Code :
  1. scanf("%d", &nombre);


 
tu dois passer l'adresse de la variable nombre qui va recevoir le nombre lu
donc tu fais &nombre.
 
Le cas des chaines de caracteres et plus généralement des tableaux (une chaine de char est un tableau de char) est particulier :
un tableau est lui meme un pointeur : il pointe sur le premier élément du tableau

Code :
  1. char Chaine[10];
  2.     printf("%X %X", Chaine, &Chaine[0]); /* meme resultat */


 
Chaine ou &Chaine[0], c'est pareil
donc, dans scanf, soit tu mets

Code :
  1. scanf("%s", texte);


car texte est un pointeur sur le debut de la chaine
soit tu mets

Code :
  1. scanf("%s", &texte[0]);


= l'adresse du premier élément de la chaine
 
Les pointeurs, c'est assez ardu ...
Garde bien en tête cette image d'URL
un pointeur c'est une adresse.
cette adresse peut désigned un gros objet tel qu'un tableau (un site entier) ou un tout petit nombre (une petite image ;))
mais aussi, un pointeur peut être invalide !
il faut s'assurer que l'objet pointé existe ... :sweat:
Bonne année !


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 25-12-2001 à 20:48:31    

Grand merci pour tes explications, j'y vois plus clair maintenant.
 
En fait ça m'a tracassé un peu et je suis retourné voir dans mon bouquin, ils disent que dans un premier temps, SCANF ne sert qu'à lire qu'un seul caractère, le premier que l'on écrit.
 
Il parlent qu'il existe plusieurs moyens de contourner cette règle, mais qu'il est préférable d'utiliser le GETS.
 
Mais pour le moment je préfère pas trop m'embrouiller avec ces nouveaux trucs, je préfère bien assimiler tout ce que j'ai vu jusqu'à maintenant...surtout que je suis en plein blocus et que j'ai autre chose à faire :)
 
Bye et à toi aussi joyeux noel & bonne année !!!


---------------
If you really want something, all the Universe conspires in helping you to achieve it.
Reply

Marsh Posté le 26-12-2001 à 11:15:07    

==> le langage C, de Kernighan et Ritchie
 
J'me repete, je sais..
 
LEGREG

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed