Advertisement
Guest User

Untitled

a guest
Aug 18th, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.30 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4.  
  5. /* Fonction : Is In Set
  6. Retour : un int valant 1 ou 0.
  7. Parametre : Un caractere et la chaine Charset contenant les separateurs.
  8. Description : Detecte si le caractere "char c" sur lequel on se trouve est un separateur ou non (donc fait parti de la chaine charset ou non). On renvoi 1 si il en fait
  9. parti , sinon 0 .
  10. */
  11. int is_in_set(char c, char *charset)
  12. {
  13. while (*charset)
  14. {
  15. if (*charset == c)
  16. return (1);
  17. ++charset;
  18. }
  19. return (0);
  20. }
  21.  
  22. /* Fonction : Leng
  23. Retour : Un int >= 1.
  24. Parametre : Notre chaine a decouper "str" et notre chaine de separateurs "charset".
  25. Description : La fonction Leng compte la taille d'un mot. On avance sur la chaine str tant que l'on rencontre pas de separateur , et on renvoi la taille de cette nouvelle portion. (qui nous sert pour le malloc)
  26. */
  27.  
  28. int leng(char *str, char *charset)
  29. {
  30. int count;
  31. count = 1;
  32. while(*str && is_in_set(*str, charset) == 0)
  33. {
  34. ++str;
  35. count++;
  36. }
  37. return (count);
  38. }
  39.  
  40. /* Fonction : Count Space
  41. Retour : Un int >= 1
  42. Parametre : Notre chaine a decouper "str" et notre chaine de separateurs "charset".
  43. Description : La fonction count space , compte notre nombre de mots au total pour qu'on puisse malloc toutes nos dimensions . Il avance dans la chaine str, si il rencontre un separateur , il compte donc un mot (une dimension), puis il skip tout les autres separateurs si il y en a plusieurs a la suite . Et il continue ainsi ...
  44. */
  45.  
  46. int count_space(char *str, char *charset)
  47. {
  48. int count;
  49.  
  50. count = 0;
  51. while (*str)
  52. {
  53. if (is_in_set(*str, charset))
  54. {
  55. while (*str && is_in_set(*str, charset))
  56. ++str;
  57. ++count;
  58. }
  59. else
  60. ++str;
  61. }
  62. return (++count);
  63. }
  64.  
  65. char **ft_split(char *str, char *charset)
  66. {
  67. char **tab;
  68. char *temp_str; // chaine tampon
  69. int i; // compteur de lettres
  70. int y; // compteurs de mots
  71.  
  72. // on malloc notre nombre de mots (donc dimension) en comptant nos mots avec count_space , on rajoute 1 pour la dimension vide a la fin.
  73. tab = (char**)malloc(sizeof(char*) * count_space(str, charset) + 1);
  74. y = 0;
  75. while (*str) // tant qu'on a pas traite toute la chaine.
  76. {
  77. if (is_in_set(*str, charset)) // si on est sur un separateur on les skip tous. Ca signifie egalement qu'on arrive sur un nouveau mot !
  78. ++str;
  79. else // Ici du coup si on est pas sur un separateur on effectue la copie !
  80. {
  81. i = 0; // on reset notre compteur de lettre
  82. temp_str = (char*)malloc(sizeof(char) * leng(str, charset)); // on malloc les lettres de notre mot avec Leng , qui compte notre nombre de lettre jusqu'au prochain separateur
  83. while (*str && is_in_set(*str, charset) == 0) // tant qu'on est pas sur un separateur on copie a fond
  84. temp_str[i++] = *(str++);
  85. temp_str[i] = 0; // on met le \0 des que on a vu un separateur
  86. tab[y] = temp_str; // on le copie dans notre tableau
  87. ++y; // on passe au mot suivant
  88. }
  89. }
  90. tab[y] = 0; // quand notre chaine est fini on oublie pas de mettre notre \0 dans notre derniere dimension vide .
  91. return (tab);
  92. }
  93.  
  94.  
  95.  
  96. /* MAIN DE TEST : ON S'EN FOU*/
  97. int main(int argc, char **argv)
  98. {
  99. char **tab;
  100. int j;
  101.  
  102. j = 0;
  103.  
  104. if(argc != 3)
  105. return(0);
  106. tab = ft_split(argv[1],argv[2]);
  107. while(tab[j] != 0)
  108. {
  109. printf("%s\n", tab[j]);
  110. j++;
  111. }
  112. return(0);
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement