Zakończenie dynamicznej tablicy dwuwymiarowej po wprowadzeniu pustego wiersza

0

Witam.
Potrzebuje stworzyć dwuwymiarową tablicę dynamiczną w C do której wprowadzamy dane wprowadzamy np:

3(spacja)21(spacja)11(enter)
4(spacja)5(spacja)125(spacja)45(enter)
1(spacja)9(spacja)4(enter)
(enter)

Pusta linia ma oznaczać koniec wprowadzania, ale nie udaje mi się tego uzyskać

for (int m=0;;++m){
  a=(float **)realloc(a,(m+1)*sizeof(*a));
  i=0;
  while ((count = scanf("%f%c", &tmp, &follow)) > 0)
  {
    if (count == 2 && (isspace(follow) || follow=='\n'))
      {
      a[m]=(float*)realloc(a[m],(i+1)*sizeof(float));
      a[m][i] = tmp;
      i++;
        if(follow=='\n')
        {
          n[m]=i;
          break;
        }
    }
    else
    {
      printf ("Wprowadzono bledne dane\n");
      EXIT_SUCCESS;
    }
  }
}
0

Kielon czy po wciśnięciu entera w nowej linii dostajesz "Wprowadzono bledne dane"?

0

Jeżeli dane są wprowadzone jak w przykładzie błąd nie wyskakuje. Poniżej wrzucam cały program. Brakuje mi tylko możliwości zatrzymania programu po wprowadzeniu pustej linni

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main () {
float tmp;
char follow;
int count;
int i=0;
float **a=NULL;
int n[100];
for (int m=0;;++m){
  a=(float **)realloc(a,(m+1)*sizeof(*a));
  i=0;
  while ((count = scanf("%f%c", &tmp, &follow)) > 0)
  {
    if (count == 2 && (isspace(follow) || follow=='\n'))
      {
      a[m]=(float*)realloc(a[m],(i+1)*sizeof(float));
      a[m][i] = tmp;
      i++;
        if(follow=='\n')
        {
          n[m]=i;
          break;
        }
    }
    else
    {
      printf ("Wprowadzono bledne dane\n");
      EXIT_SUCCESS;
    }
  }
}

0

Powinno działać, ale nie testowałem dość dokładnie:
https://wandbox.org/permlink/Yfk1dAutbQ7UJ0Ro

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>

int scanLineForDoubles(const char *line, double **allocsTable)
{
    double x;
    char *p = (char *)line;
    int count = 0;
    
    errno = 0;
    while (p && *p)
    {
        char *oldP = p;
        x = strtod(p, &p);
        if (oldP == p)
            break;
        *allocsTable = realloc(*allocsTable, (count+1)*sizeof(**allocsTable));
        (*allocsTable)[count++] = x;
    }
    return count;
}

void freeMatrix(double **matrix, int columntCount)
{
    if (!matrix || !columntCount) return;
    for (int i = 0; i < columntCount; ++i)
        free(matrix[i]);
    free(matrix);
}

int loadMatrix(FILE* f, double ***allocMat,  int *resultRowSize)
{
    int count = 0;
    int rowSize = 0;
    char line[0x400];
    
    while (fgets(line, sizeof(line), f))
    {
        double *row = NULL;
        int newRowSize = scanLineForDoubles(line, &row);
        if (newRowSize <= 0) break;
        if (!rowSize) {
            rowSize = newRowSize;
        } else {
            if (rowSize != newRowSize) {
                freeMatrix(*allocMat, count);
                *allocMat = NULL;
                return -1;
            }
        }
        *allocMat = realloc(*allocMat, (count+1)*sizeof(**allocMat));
        (*allocMat)[count++] = row;
    }
    *resultRowSize = rowSize;
    return count;
}

int main(void)
{
    double **m = NULL;
    int rowSize = 0;
    int columnSize = loadMatrix(stdin, &m, &rowSize);
    
    int i, j;
    
    printf("(%d , %d)\n", columnSize, rowSize);
    for (i = 0; i < columnSize; ++i) {
        for (j = 0; j < rowSize; ++j) {
            printf("%8lg ", m[i][j]);
        }
        printf("\n");
    }
    
    freeMatrix(m, columnSize);
    
    return EXIT_SUCCESS;
}
0

Wielkie dzięki. Programik działa. Tylko nie rozumiem dlaczego zadeklarowano tablicę char w ten sposób:

 char line[0x400]

Zwiększa to pojemność tablicy? Nie można po prostu zadeklarować tego jako line[400]?

0

Nie można, bo 0x400 == 1024 != 400. Dlaczego zapisano szesnastkowo zamiast dziesiętnie, pozostaje zgadywać nam obu…

1 użytkowników online, w tym zalogowanych: 0, gości: 1