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 :

Remplir liste à partir de l'entrée standard


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut Remplir liste à partir de l'entrée standard
    Bonjour,

    Mon fonction ci-dessous sort normalement (pas d'erreur lors de la compilation) mais je ne peux que remplir qu'une seule valeur.

    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
     
    Node* createList()	               
    {    
    	char ch;
     
    	Node *pt_head=NULL, *pt_tail=NULL, *pt_new; 
     
        do
        {
        	//Initialisation du pointeur du nouveau élément (création d'une nouvelle adresse) 
        	pt_new = (Node*)malloc(sizeof(Node));   
            if(!pt_new)  /* Si l'allocation a échoué. */
    		{ 
    		  printf("Memory not allocated.\n");
    		  exit(EXIT_FAILURE);     
    		}
     
            //Remplir le champ data du nouveau élément
        	printf("\nGive an integer number : ");
            scanf("%d", &pt_new -> val);        
    	    //pt_new -> pt_next = NULL; 
     
    	    if(!pt_head)
    	       {
    	       	  pt_head=pt_new;     
    	       	  pt_tail=pt_new;
    	       	  pt_tail -> pt_next = NULL; 
    		   }
    	    else 
    	    {
    	    	pt_new -> pt_next=pt_head;
    			pt_head=pt_new; 	    		
    		}
     
    		printf("Y-Continue, N-Exit : ");
    		fflush (stdin); 		 
    		scanf("%c",&ch);   
    	}	while (ch=='Y');  
     
    	return pt_head;	
    }
    Merci pour ceux qui peuvent m'aider.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par hogar Voir le message
    Merci pour ceux qui peuvent m'aider.
    Avoir la structure Node aurait été un plus mais on peut la retrouver. En revanche, sans main() pour essayer...

    Sinon à quoi sert pt_tail qui n'est utilisé que quand il est égal à pt_new ? Autant rester sur pt_new quoi. Et on ne fflushe jamais stdin car la fonction fflush() est faite pour finaliser les écritures en attentes (or stdin est un tampon de lecture donc on ne peut rien lui écrire).

    Et on ne quitte pas un programme quand une fonction échoue. Quand une fonction échoue, on renvoie le souci à l'appelant qui prendra une décision (sans avoir le droit de quitter lui non plus ce qui constituera alors une chaine complète de gestion des erreurs). Et ça ne coûte pas plus cher d'écrire explicitement if (pt_new == NULL) (écrire le plus serré possible ne fait pas aller le code plus vite pour autant et question relecture...).

    Citation Envoyé par hogar Voir le message
    mais je ne peux que remplir qu'une seule valeur
    Remplace while (ch=='Y') par while (ch != 'N') et quand ça marchera (*), réfléchis attentivement au contenu exact de stdin juste après le scanf("%d", &pt_new -> val). Puis tu iras voir l'auteur de fflush(stdin) lui demander de justifier son intelligente suggestion.

    (*) tu pourras saisir mais en revanche tu ne pourras plus quitter
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Merci sve@r pour ta réponse.

    C'est toujours un problème lié à scanf() dans une boucle en particulier avec les chaine de caractères. D'ailleurs que je n'ai jamais pu résoudre ni trouver une solution radicale.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    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
     
    typedef struct Node
    	   {
    		int val;              //Data
    		struct Node* pt_next; //pointeur (lien) vers l'élement suivant de même type (pointeur sur un objet de type Node)
    	   } Node;
     
     
     
    int main()
    {
    	const int n=5;	
     
    	Node *head=createList();
     
             traverseList(head);
     
    	freeMemory(head);
     
    	return 0;
    }

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hogar Voir le message
    C'est toujours un problème lié à scanf() dans une boucle en particulier avec les chaine de caractères.
    Plus précisément une saisie de nombre (int/float) suivie par une saisie de caractère.

    Citation Envoyé par hogar Voir le message
    D'ailleurs que je n'ai jamais pu résoudre ni trouver une solution radicale.
    C'est pour ça que je t'ai dit de réfléchir sur le contenu de stdin. Quand tu tapes ta valeur, style 12, tu le valides par <return>. Le scanf() récupère le 12 et laisse le <return> dans stdin. Ensuite à la saisie suivante...
    Solution: char chaine[100]; fgets(chaine, 100, stdin) pour faire saisir la valeur dans une chaine, ainsi stdin est propre. Et ensuite sscanf(chaine, "%d", &val) pour récupérer la valeur depuis la chaine saisie. Et tu peux même vérifier via le retour de sscanf() (nombre d'éléments récupérés) qu'il a bien récupéré un élément (la valeur).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 316
    Points
    8 316
    Par défaut
    Attention flush(stdin) à un comportement indéterminé UB. (Ça peut fonctionner comme pas).
    Une solution rapide pour manger le '\n', c'est de mettre un espace avant le %c de la saisie de caractère.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    Merci Sve@r j'ai remplacé scanf() par fgets et sscanf() et ça marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char chaine[100];
    .......................................................
    printf("\nGive an integer number : ");
    fgets(chaine, 100, stdin);	    
    sscanf(chaine, "%d", &pt_new -> val);
     
    ......................................................
    printf("Y-Continue, N-Exit : ");
    fgets(chaine, 100, stdin);   //ou bien
    sscanf(chaine,"%c",&ch);
    ...................................................
    Merci.

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par hogar Voir le message
    Merci Sve@r j'ai remplacé scanf() par fgets et sscanf() et ça marche.
    Faut faire plus que remplacer, faut aussi comprendre ce qui se passe. Ainsi ça permet de rajouter des contrôles...

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (1) {
    	printf("\nGive an integer number : ");
    	fgets(chaine, 100, stdin);
    	if (sscanf(chaine, "%d", &pt_new -> val) == 1) break;
    	printf("Mauvaise saisie, recommencez !!!\n");
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Merci Sve@r.

  10. #10
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    Par défaut
    et faire attention, si tu rentres "55toto"
    pt_new -> val va contenir 55

    sscanf(chaine, "%d" => va retourner 1 si chaine commence par un entier

    si tu veux que chaine soit un entier, il faut ajouter d'autres contrôles

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

Discussions similaires

  1. [Joomla!] remplir liste deroulante a partir d'une BD
    Par paskal++ dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 06/04/2014, 20h48
  2. remplir liste deroulante a partir base de la donnees
    Par Miss kouka dans le forum Langage
    Réponses: 4
    Dernier message: 10/05/2010, 12h27
  3. [JComboBox] Remplir à partir d'un ResultSet
    Par Samanta dans le forum Composants
    Réponses: 9
    Dernier message: 27/05/2005, 16h49
  4. [JList] Remplir à partir d'objets
    Par Invité dans le forum Composants
    Réponses: 6
    Dernier message: 31/01/2005, 09h55
  5. Réponses: 2
    Dernier message: 21/12/2004, 15h28

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