IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Problème avec scanf("%s",str)


Sujet :

C

  1. #1
    Membre à l'essai Avatar de mathieumadrid
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 39
    Points : 23
    Points
    23
    Par défaut Problème avec scanf("%s",str)
    Bonjour,

    Je veux récupérer un texte passé par la commande en le stockant dans une variable titre (avec char* titre; déclaré avant) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("Titre : ");
    	scanf("%s",titre);
    Ensuite, je veux récupérer un autre texte de la commande que je mets dans numero. Par la suite, je veux travailler sur numero. Voici le code complet de ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    MEDIA* ecrire()
    {
    	MEDIA* media;
    	char* titre;
    	char* numero;
    	int support;
    	int numeroGlobal[3];
    	int type;
    	int numeroType[2];
    	int jour[2];
    	int mois[2];
    	int annee[2];
    	DATE date;
     
    	printf("Titre : ");
    	scanf("%s",titre);
    	printf("Media : ");
    	scanf("%s",numero);
     
    	if(strlen(numero) != 13)
    		return NULL;
     
    	sscanf(numero++,"%1i",&support);
    	sscanf(numero++,"%1i",numeroGlobal);
    	sscanf(numero++,"%1i",&numeroGlobal[1]);
    	sscanf(numero++,"%1i",&numeroGlobal[2]);
    	sscanf(numero++,"%1i",&type);
    	sscanf(numero++,"%1i",numeroType);
    	sscanf(numero++,"%1i",&numeroType[1]);
    	sscanf(numero++,"%1i",jour);
    	sscanf(numero++,"%1i",&jour[1]);
    	sscanf(numero++,"%1i",mois);
    	sscanf(numero++,"%1i",&mois[1]);
    	sscanf(numero++,"%1i",annee);
    	sscanf(numero,"%1i",&annee[1]);
     
    	date.jour[0] = jour[0];
    	date.jour[1] = jour[1];
    	date.mois[0] = mois[0];
    	date.mois[1] = mois[1];
    	date.annee[0] = annee[0];
    	date.annee[1] = annee[1];
    	media = creation(titre,support,numeroGlobal,type,numeroType,date);
     
    	return media;
    }
    Le problème, c'est que quand j'appelle la fonction j'ai une erreur tandis que si j'enlève la lecture de titre alors ça marche !

    Merci de m'éclairer !

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par mathieumadrid
    Je veux récupérer un texte passé par la commande en le stockant dans une variable titre (avec char* titre; déclaré avant) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("Titre : ");
    	scanf("%s",titre);
    Tu n'as pas assez de place pour stocker une chaine de caractere dans une variable de type pointeur vers integer (ton char *titre). Du coup, ca plante. Pour resoudre le probleme, on fait de la place:
    qui peut contenir un titre d'au plus 99 caracteres + le '\0' final.

  3. #3
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Héhé l'erreur courante des gens qui viennent des langages evolués et croient que "char *" = "variable de type chaine"

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Comme te l'a mentionné DaZumba, il te faut réserver l'espace destiné à recevoir la chaine titre. L'expression char *titre; définit un pointeur sur caractère et non un tableau de caractère. Il te faut réserver cet espace soit sur la pile en définissant titre comme un tableau de caractère, soit sur le tas en utilisant l'allocation dynamique de mémoire (qui n'est probablement pas nécessaire ici). Tu dois donc définir comme l'a dit DaZumba:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char titre[100]; /*Peut contenir une chaine de 99 caractères + '\0' terminal*/
    Dans le contexte de cette saisie utilisateur, je trouve que fgets est plus adaptée que scanf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(titre, sizeof titre, stdin);
    En effet, dans ce cas, quelque soit la chaine de caractère entrée par l'utilisateur, fgets ne stocke que les sizeof titre - 1 = 99 caractères dans titre et ajoute le caractère nul. C'est plus sécurisé.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre à l'essai Avatar de mathieumadrid
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 39
    Points : 23
    Points
    23
    Par défaut
    Merci pour vos réponses.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec scanf
    Par mimina dans le forum C
    Réponses: 27
    Dernier message: 13/11/2006, 19h30
  2. problème avec scanf
    Par thierry_b dans le forum C
    Réponses: 10
    Dernier message: 21/12/2005, 20h10
  3. problème avec scanf
    Par troumad dans le forum C
    Réponses: 30
    Dernier message: 20/11/2005, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo