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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
   |  
/* -ed-
#include "stdio.h"
#include "stdlib.h"
 
pour les entetes standards, c'est pas " " mais < >
*/
#include <stdio.h>
#include <stdlib.h>
 
/* -ed-
ajoute pour strcmp(). 
Apprendre a mieux regler son compilateur peut sauver des vies...  
*/
#include <string.h>
 
#define MAX 250
 
// Definition des structures
 
typedef struct{
   char* nom;
   /* -ed- attention, pointeur non initialise... */
   int n;
}
structure;
 
// Methode
 
/* -ed- fonction non exportee : ajoute 'static' */
static void tri_insertion(structure t[], int n)
{
   int i, j;
   structure tmp;
 
   for (i = 1;i < n;i++)
   {
      j = i;
      while ( j > 0 && strcmp(t[j].nom, t[j - 1].nom) < 0)
      {
         // Permuter
         tmp = t[j];
         t[j] = t[j - 1];
         t[j - 1] = tmp;
 
         j = j - 1;
      }
   }
 
 
}
 
// Main()
 
int main()
{
   structure tab_conf[MAX];
   int nb_conf = 0;
   int i = 0;
 
   structure* nouveau = malloc(sizeof(structure));
   /* -ed- 
      malloc() peut echouer. De plus, la valeur de nouveau->nom 
      est toujours indeterminee... 
      
      Pourquoi une allocation dynamique de la structure ?
    */
 
   if (nouveau != NULL)
   {
      while (i < 8)
      {
 
         /* -ed-
             scanf("%s",&nouveau->nom);
             
             Comportement indéfini : 
             "%s" attend l'adresse du premier element d'un tableau de char. 
             Pas l'adresse d'un pointeur sur char 
             (non initialise, de surcroit). 
             
             D'autre part, comme souvent, scanf() est ici mal utilise. 
             - Pas de limitation de la taille saisie
             - Pas de test de la valeur retournee
             - Pas de possibilité de saisir un espace...
             
             scanf() n'est pas une fonciotn de debutant, ni meme de 
             confirme...
             
             Alternatives :
             
             <a href="http://emmanuel-delahaye.developpez.com/notes.htm" target="_blank">http://emmanuel-delahaye.developpez.com/notes.htm</a>
             <a href="http://emmanuel-delahaye.developpez.com/notes.htm" target="_blank">http://emmanuel-delahaye.developpez.com/notes.htm</a>
             
             */
         scanf("%s", nouveau->nom);
 
         tab_conf[nb_conf] = *nouveau;
         /* -ed- 
         attention, en admettant que la zone pointee par 
         nouveau->nom soit valide, le pointeur serait recopie, mais pas la 
         zone pointee... 
         
         Je ne sais bien ce que tu cherches a faire mais c'est louche...
         */
 
         nb_conf++;
 
         tri_insertion(tab_conf, nb_conf);
         /* -ed- ca fout la trouille... */
 
         i++;
         /* -ed- varie comme 'nb_conf'. Est-ce bien utile ? */
      }
 
      for (i = 0;i < nb_conf;i++)
         printf("%s", tab_conf[i].nom);
         /* -ed- 
         Sortie incertaine. Il manque un '\n' ou un fflush(stdout)
         
         Evidemment, dans une structure de code, il est toujours preferable 
         d'ajouter les { }...
         
         */
 
      /* -ed- memoire non liberee... Ajoute : */
      free (nouveau), nouveau = NULL;
   }
 
   return 0;
} | 
Partager