2788.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. /**
  5. * Note: The returned array must be malloced, assume caller calls free().
  6. */
  7. char**
  8. splitWordsBySeparator(char** words, int wordsSize, char separator,
  9. int* returnSize)
  10. {
  11. struct {
  12. char **data;
  13. unsigned long cap;
  14. unsigned long size;
  15. } ret = {0};
  16. char buf[21] = {0};
  17. ret.cap = wordsSize;
  18. for ( int i = 0; i < wordsSize; ++i ) {
  19. char *cstr = words[i];
  20. while ( *cstr != '\0' ) {
  21. ret.cap += ( *cstr == separator );
  22. ++cstr;
  23. }
  24. }
  25. ret.data = malloc((ret.cap+1) * sizeof(*ret.data));
  26. memset(ret.data, 0, (ret.cap+1) * sizeof(*ret.data));
  27. ret.size = 0;
  28. for ( int i = 0; i < wordsSize; ++i ) {
  29. unsigned long wsize = 0;
  30. char *cstr = words[i];
  31. while ( *cstr != '\0' ) {
  32. if ( *cstr == separator ) {
  33. ++cstr;
  34. if ( wsize == 0 ) { continue; }
  35. ret.data[ret.size] = calloc(wsize + 1, sizeof(char));
  36. memcpy(ret.data[ret.size], buf, wsize);
  37. ++ret.size;
  38. wsize = 0;
  39. continue;
  40. }
  41. buf[wsize++] = *cstr;
  42. ++cstr;
  43. }
  44. if ( wsize == 0 ) { continue; }
  45. ret.data[ret.size] = calloc(wsize + 1, sizeof(char));
  46. memcpy(ret.data[ret.size], buf, wsize);
  47. ++ret.size;
  48. }
  49. *returnSize = ret.size;
  50. return ret.data;
  51. }
  52. void
  53. r(char **ws, int s, char sep)
  54. {
  55. int ret_size = 0;
  56. char **retorig = splitWordsBySeparator(ws, s, sep, &ret_size);
  57. printf("RetSize = %d\n", ret_size);
  58. if ( retorig == NULL ) return;
  59. char **ret = retorig;
  60. printf("Ret = [");
  61. while ( *ret != NULL ) {
  62. printf("\"%s\", ", *ret);
  63. free(*ret++);
  64. }
  65. printf("]\n");
  66. free(retorig);
  67. }
  68. int
  69. main(void)
  70. {
  71. char *words[] = {"one.two.three","four.five","six"};
  72. r(words, 3, '.');
  73. return 0;
  74. }