fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4.  
  5. typedef double Type;
  6. #define SCAN_FORMAT "%lf"
  7. #define PRINT_FORMAT "%g"
  8.  
  9. typedef struct jagged_rows {
  10. size_t n; //number of elements
  11. Type *elements;
  12. } JaggedArray_row;
  13.  
  14. typedef struct jagged_array {
  15. size_t n; //number of rows
  16. JaggedArray_row *rows;
  17. } JaggedArray;
  18.  
  19. JaggedArray *load(FILE *file){
  20. JaggedArray *ja = malloc(sizeof(*ja));
  21. if(ja == NULL){
  22. perror("malloc");
  23. exit(EXIT_FAILURE);
  24. }
  25. ja->n = 0;
  26. ja->rows = NULL;
  27.  
  28. int ch, has_value = 0;
  29. size_t rows = 0, cols = 0;
  30. while((ch = getc(file)) != EOF){
  31. if(isspace(ch)){
  32. if(ch == '\n' && has_value){
  33. ++rows;
  34. has_value = cols = 0;
  35. }
  36. continue;
  37. }
  38. ungetc(ch, file);
  39. if(has_value){
  40. ja->rows[rows].elements = realloc(ja->rows[rows].elements, ++ja->rows[rows].n * sizeof(Type));//check omitted
  41. fscanf(file, SCAN_FORMAT, &ja->rows[rows].elements[cols++]);//check omitted
  42. } else {
  43. has_value = 1;
  44. ja->rows = realloc(ja->rows, ++ja->n * sizeof(*ja->rows));//check omitted
  45. ja->rows[rows].n = 0;
  46. ja->rows[rows].elements = malloc(++ja->rows[rows].n * sizeof(Type));//check omitted
  47. fscanf(file, SCAN_FORMAT, &ja->rows[rows].elements[cols++]);//check omitted
  48. }
  49. }
  50. return ja;
  51. }
  52.  
  53. int main(void) {
  54. JaggedArray *ja = load(stdin);
  55. for(int r = 0; r < ja->n; ++r){
  56. for(int c = 0; c < ja->rows[r].n; ++c){
  57. if(c)
  58. putchar(' ');
  59. printf(PRINT_FORMAT, ja->rows[r].elements[c]);
  60. }
  61. puts("");
  62. free(ja->rows[r].elements);
  63. }
  64. free(ja->rows);
  65. free(ja);
  66. return 0;
  67. }
Success #stdin #stdout 0s 2304KB
stdin
2 3 1 
1 2 3 4 5 6
1 2 3 4 5
1 2 
1 
stdout
2 3 1
1 2 3 4 5 6
1 2 3 4 5
1 2
1