Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1988 connectés 

 


Dernière réponse
Sujet : [C] Aide sur scanf
LeGreg ==> le langage C, de Kernighan et Ritchie
 
J'me repete, je sais..
 
LEGREG

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
LeGreg ==> le langage C, de Kernighan et Ritchie
 
J'me repete, je sais..
 
LEGREG
Eniac 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 !!!
HelloWorld 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 !

Eniac 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+
HelloWorld 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)

godbout 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
Fork 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.
sisicaivrai

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

Eniac 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 ?
qxn 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 ;(
Eniac 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);
corvincent #include <stdio.h>
 
main()
{
char text[21];
 
printf("texte:" );
gets(text);
 
printf("%s",text);
}
 
voila ça sa tourne
Olivier51 Ben justement non scanf("%s",txt) ne marche pas il ne renvoie seulement que "Bonjour"
corvincent ben scanf("%s",txt);
 
 
char txt[22+1]  // +1 car \0 de fin de chaine et 22 pour le reste
Olivier51 non seulement en C et sans créer sa fonction ...
Alload Peux-tu utiliser les string (C++)?
Olivier51 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".

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)