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
| #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SPLIT_SIZE 20
char ** split(char *buff, size_t *n_splits);
void split_delete(char ***ppp);
int main(void)
{
size_t i;
char buff[100] = "azerty.qsdfg.wxcvb";
size_t n_splits = 0;
char ** pp = split(buff, &n_splits);
for (i = 0; i < n_splits; i++)
{
printf("%s\n", pp[i]);
}
split_delete(&pp);
return 0;
}
char** split(char *buff, size_t *n_splits)
{
char **chaines = NULL;
/* -tc- vaidation des parametres */
if (buff != NULL && n_splits != NULL)
{
size_t i = 0;
size_t n = 1;
for (i = 0; buff[i] != '\0'; i++)
{
if (buff[i] == '.')
{
n++;
}
}
chaines = malloc(n * sizeof *chaines);
if (chaines != NULL)
{
chaines[0] = malloc(n * sizeof *chaines[0] * SPLIT_SIZE);
if (chaines[0] != NULL)
{
char *pseek = NULL;
for (i = 1; i < n; i++)
{
chaines[i] = &chaines[0][i * SPLIT_SIZE];
}
pseek = strtok(buff, ".");
i = 0;
while (pseek != NULL)
{
chaines[i][0] = '\0';
strncat(chaines[i], pseek, SPLIT_SIZE - 1);
++i;
pseek = strtok(NULL,".");
}
/* -tc- retour du nombre de splits */
*n_splits = n;
}
else
{
/* -tc- Erreur d'allocation: on fait le menage! */
free(chaines), chaines = NULL;
}
}
}
return chaines;
}
void split_delete(char ***ppp)
{
if (ppp != NULL && *ppp != NULL)
{
free((*ppp)[0]);
free(*ppp), *ppp = NULL;
}
} |