fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. #define DEFAULT_SIZE 10
  6.  
  7. typedef struct {
  8. char (*pointer)[256];
  9. int used;
  10. int size;
  11. } Array;
  12.  
  13. Array *createArray(int start_size) {
  14. Array *array = malloc(sizeof( *array));
  15. array->used = 0;
  16. array->size = start_size;
  17. array->pointer = malloc(start_size * sizeof *array->pointer); // <--- here
  18. return array;
  19. }
  20.  
  21.  
  22. void append(Array *array, char* elem) {
  23. if (array->used >= array->size) {
  24. // expand table
  25. array->pointer = realloc(array->pointer, array->size * 2 * sizeof *array->pointer);
  26. array->size *= 2;
  27. }
  28. // append new arg
  29. strcpy(array->pointer[array->used] , elem); // <-- here
  30. array->used++;
  31. }
  32.  
  33. Array *parse(char* command) {
  34. // split command by space and store each arg in array
  35. char *args_str;
  36. Array *args_list = createArray(DEFAULT_SIZE); // expandable array holding arguments
  37.  
  38. args_str = strtok(command, " ");
  39.  
  40. do {
  41. append(args_list, args_str);
  42. } while(args_str = strtok(NULL, " "));
  43.  
  44.  
  45. return args_list;
  46. }
  47.  
  48. int main(void)
  49. {
  50. Array *array;
  51. char cmd[] = "ls -alh --color /tmp";
  52.  
  53. array = parse(cmd);
  54.  
  55. if(array == NULL)
  56. return 0;
  57.  
  58. printf("Array->used: %d, array->size: %d\n", array->used, array->size);
  59. for(int i = 0; i < array->used; ++i)
  60. puts(array->pointer[i]);
  61.  
  62. free(array->pointer);
  63. free(array);
  64. }
  65.  
Success #stdin #stdout 0s 4352KB
stdin
Standard input is empty
stdout
Array->used: 4, array->size: 10
ls
-alh
--color
/tmp