str.c 2.8 KB

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