fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void print_segment(char *s, int idx)
  6. {
  7. printf("Segment[%d] → %s\n", idx, s);
  8. }
  9.  
  10. void strsplit(char *str, char *delim, int limit, void (*cb)(char *s, int idx))
  11. {
  12. char *search = strdup(str);
  13.  
  14. if (limit == 1) {
  15. cb(search, 0);
  16. }
  17. else {
  18. int i = 0, count = 0, len = strlen(str), len_delim = strlen(delim);
  19. char *segment = NULL, *leftover = NULL;
  20. limit = limit > 0 ? limit - 1 : len;
  21.  
  22. segment = strtok(search, delim);
  23. for (i = 0; segment != NULL && i < limit; i++) {
  24. count += strlen(segment) + len_delim;
  25. cb(segment, i);
  26. segment = strtok(NULL, delim);
  27. }
  28.  
  29. if (len != limit && count < len) {
  30. leftover = (char*) malloc(len - count + 1);
  31. memcpy(leftover, str + count, len - count);
  32. leftover[len - count] = '\0';
  33. cb(leftover, i);
  34. free(leftover);
  35. }
  36. }
  37. }
  38.  
  39. int main(int argc, char *argv[])
  40. {
  41. printf("\nSplit \"a;b;c;d\" limit 0\n");
  42. strsplit("a;b;c;d", ";", 0, print_segment);
  43.  
  44. printf("\nSplit \"a;b;c;d\" limit 1\n");
  45. strsplit("a;b;c;d", ";", 1, print_segment);
  46.  
  47. printf("\nSplit \"a;b;c;d\" limit 2\n");
  48. strsplit("a;b;c;d", ";", 2, print_segment);
  49.  
  50. printf("\nSplit \"a;b;c;d\" limit 3\n");
  51. strsplit("a;b;c;d", ";", 3, print_segment);
  52.  
  53. printf("\nSplit \"a;b;c;d\" limit 4\n");
  54. strsplit("a;b;c;d", ";", 4, print_segment);
  55.  
  56. printf("\nSplit \"a;b;c;d\" limit 5\n");
  57. strsplit("a;b;c;d", ";", 5, print_segment);
  58.  
  59. printf("\nSplit \"a;b;c;d\" limit 6\n");
  60. strsplit("a;b;c;d", ";", 6, print_segment);
  61.  
  62. return 0;
  63. }
  64.  
Success #stdin #stdout 0.01s 1852KB
stdin
Standard input is empty
stdout
Split "a;b;c;d" limit 0
Segment[0] → a
Segment[1] → b
Segment[2] → c
Segment[3] → d

Split "a;b;c;d" limit 1
Segment[0] → a;b;c;d

Split "a;b;c;d" limit 2
Segment[0] → a
Segment[1] → b;c;d

Split "a;b;c;d" limit 3
Segment[0] → a
Segment[1] → b
Segment[2] → c;d

Split "a;b;c;d" limit 4
Segment[0] → a
Segment[1] → b
Segment[2] → c
Segment[3] → d

Split "a;b;c;d" limit 5
Segment[0] → a
Segment[1] → b
Segment[2] → c
Segment[3] → d

Split "a;b;c;d" limit 6
Segment[0] → a
Segment[1] → b
Segment[2] → c
Segment[3] → d