| 12
 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