str.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "str.h"
  4. char** str_split(char* str, const char delim, int* length) {
  5. char** res;
  6. char* signet, * tmp = str;
  7. char last = 0;
  8. int compteur = 0, nb = 1, taille, count = 0;
  9. //Compte le nombre d'element
  10. while (*tmp) {
  11. if (*tmp == delim && last != delim) {
  12. nb++;
  13. }
  14. last = *tmp;
  15. tmp++;
  16. }
  17. //Creation du tableau
  18. res = malloc(sizeof (char*) * (nb + 1));
  19. //Decoupage
  20. tmp = str;
  21. while (*tmp) {
  22. //Si c'est le dernier mot
  23. if (compteur == nb - 1) {
  24. //Ajoute tous ce qui reste
  25. res[compteur] = malloc(sizeof (char) * (strlen(str) - count));
  26. int i = 0;
  27. while(*tmp){
  28. res[compteur][i++] = *tmp;
  29. tmp++;
  30. }
  31. } else {
  32. //Recup la taille du mot
  33. signet = tmp;
  34. taille = 0;
  35. while (*tmp != delim) {
  36. taille++;
  37. tmp++;
  38. count++;
  39. }
  40. //Creation du mot
  41. res[compteur] = malloc(sizeof (char) * taille);
  42. //Ajout du mot
  43. for (int i = 0; i < taille; i++) {
  44. res[compteur][i] = *signet;
  45. signet++;
  46. }
  47. compteur++;
  48. //Passe les delimiteurs consecutif
  49. while (*tmp == delim) {
  50. tmp++;
  51. count++;
  52. }
  53. }
  54. }
  55. //Ajoute NULL à la fin
  56. res[nb + 1] = NULL;
  57. //Retour nombre de mot et tableau
  58. *length = nb;
  59. return res;
  60. }
  61. char* trim(char* str){
  62. return ltrim(rtrim(str, ' '), ' ');
  63. }
  64. char* mtrim(char* str, char mask){
  65. return ltrim(rtrim(str, mask), mask);
  66. }
  67. char* ltrim(char* str, char mask){
  68. //Variable
  69. int cmpt = 0;
  70. char* res;
  71. //Compte le nombre d'espace
  72. while(str[cmpt] == mask){
  73. cmpt++;
  74. }
  75. //Si aucun espace au debut
  76. if(cmpt == 0){
  77. res = malloc(sizeof(char) * strlen(str));
  78. strcpy(res, str);
  79. return res;
  80. }
  81. //Sinon creation nouvelle chaine
  82. res = malloc(sizeof(char) * (strlen(str) - cmpt + 1));
  83. for(int i = 0, j = cmpt; i < (strlen(str) - cmpt); i++, j++){
  84. res[i] = str[j];
  85. }
  86. //Retour nouvelle chaine
  87. return res;
  88. }
  89. char* rtrim(char* str, char mask){
  90. //Variable
  91. int cmpt = strlen(str) - 1;
  92. char* res;
  93. //Compte le nombre d'espace
  94. while(str[cmpt] == mask){
  95. cmpt--;
  96. }
  97. //Si aucun espace au debut
  98. if(cmpt == strlen(str) - 1){
  99. res = malloc(sizeof(char) * strlen(str));
  100. strcpy(res, str);
  101. return res;
  102. }
  103. cmpt++;
  104. //Sinon creation nouvelle chaine
  105. res = malloc(sizeof(char) * (cmpt + 2));
  106. for(int i = 0; i < cmpt; i++){
  107. res[i] = str[i];
  108. }
  109. //Retour nouvelle chaine
  110. return res;
  111. }