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 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
/* Giacomoni Jessy et ROUSSET Loïc le 17/12/11
permet la découpe d'une chaine de caractère suivant les symbole < > & | \t ' ' \0 \n \r
printf : affichage sur la console
free : libère la mémoire après avoir fait un mallo
*/
#include "cembarque.h"
/* renvoie un tableau contenant l'ensemble des mots de chaine
realiser un free sur le premier mot puis sur le resultat de la fonction quand on n'en a plus besoin */
void gestionChaine()
{
unsigned int taille;
unsigned int nb_mots = 0;
unsigned int parcourTab, parcourTab2;
char* texte;
char** resultat;
char*chaine = saisieClavier();
/* on calcule la taille de chaine et le nombre de mots de chaine */
for(parcourTab = 0; chaine[parcourTab] != '\0'; parcourTab++)
{
if((chaine[parcourTab] == ' ') || (chaine[parcourTab] == '<') || (chaine[parcourTab] == '>') || (chaine[parcourTab] == '&') || (chaine[parcourTab] == '|') || (chaine[parcourTab] == '\r') || (chaine[parcourTab] == '\t') || (chaine[parcourTab] == '\n') || (chaine[parcourTab] == '\0'))
nb_mots++;
}
taille = parcourTab;
/* on fait les allocations correspondantes */
texte = (char*) malloc(sizeof(char) * (taille + 1));
resultat = (char**) malloc(sizeof(char*) * (nb_mots + 1));
/* echecs */
if( texte == NULL )
{
fprintf(stderr,"Allocation impossible \n");
exit(EXIT_FAILURE);
}
if( resultat == NULL )
{
fprintf(stderr,"Allocation impossible \n");
exit(EXIT_FAILURE);
}
/* on met le premier mot dans le tableau et on met le dernier mot a NULL pour savoir quand le tableau s'arrete */
resultat[0] = texte + '\0';
resultat[nb_mots] = NULL;
texte[taille] = '\0';
/* on copie chaine dans texte en remplacant les espaces par des fins de chaine en ajoutant les debuts de mot a res */
parcourTab2 = 1;
for(parcourTab = 0; parcourTab < taille; parcourTab++)
{
if((chaine[parcourTab] == ' ') || (chaine[parcourTab] == '<') || (chaine[parcourTab] == '>') || (chaine[parcourTab] == '&') || (chaine[parcourTab] == '|') || (chaine[parcourTab] == '\r') || (chaine[parcourTab] == '\t') || (chaine[parcourTab] == '\n') || (chaine[parcourTab] == '\0'))
{
texte[parcourTab] = '\0';
resultat[parcourTab2] = texte + parcourTab + 1;
parcourTab2++;
}
else
texte[parcourTab] = chaine[parcourTab];
}
afficher_mots(resultat);
free(resultat);
texte=NULL;
free(texte);
}
void afficher_mots(char const * const * resultat)
{
unsigned int affichage;
for(affichage = 0; resultat[affichage] != NULL; affichage++)
printf("mot %d : %s\n", affichage, resultat[affichage]);
resultat = NULL;
}
/* Giacomoni Jessy et ROUSSET Loïc le 12/12/11
PurgeStdin permet de vider le fichier stdin (fichier d'entrée sortie ici pour la saisie clavier)
utilisation de getchar : permettant de retourné le nombre de caractère*/
void PurgeStdin()
{
int c;
c = getchar();
while ((c != '\0') && (c != '\n'))
c = getchar();
}
/* Giacomoni Jessy et ROUSSET Loïc le 14/12/11
saisieClavier permet de gérer la saisie clavier, (les erreurs ...)
malloc : détermine l'espace mémoire prix par le tableau suivant le nombre de caractère que l'utilisateur souhaite
getchar : permettant de savoir le nombre de caractère
printf : affichage sur la console
scanf : permet de récuper dans une variable ce qu'à entré l'utilisateur (ne prend pas en charge les espaces)
fgets : idem scanf sauf que l'on peut déliminer la taille que l'on veut récupérer (il prend en charge les espaces)*/
char *saisieClavier()
{
/* Initialisation des variables */
int nbCaract=0;
char* text = NULL;
char* buffer = NULL;
// Malloc du tableau
buffer = (char*) malloc(sizeof(char)*(TAILLE));
if( buffer == NULL )
{
fprintf(stderr,"Allocation impossible");
exit(EXIT_FAILURE);
}
// Demande saisi d'une phrase dans buffer + déplacement dans text
printf("\r\nSaisie votre chaine (avec separateur) :\r\nICI -> \n");
fgets(buffer, TAILLE, stdin);
nbCaract = strlen(buffer) - 1;
text = (char*) malloc(sizeof(char) * (nbCaract));
if( text == NULL )
{
fprintf(stderr,"Allocation impossible");
exit(EXIT_FAILURE);
}
PurgeStdin();
strcpy(text,buffer);
buffer = NULL;
free(buffer);
printf ("Si la chaine de depart est : %s \n", text);
printf ("Le tableau a 2 dimensions sera consitue de : \n");
return text;
} |
Partager