c – Comprobación de nulo en una matriz 2d

Estoy llenando una cuadrícula de 10 x 10 de caracteres de un archivo de entrada. Necesito verificar si la cuadrícula es un cuadrado (es decir, tiene N x N caracteres, donde N <= 10)

El archivo de entrada es tal:

pitk olpe pkey tope 

Cuando imprimo la cuadrícula en gdb, obtengo el siguiente resultado:

 $1 = {"pitk\000\000\000\000\366h", "olpe\000\000\001\000\000", "pkey\000\000\000\000\000", "tope\000\000\000\000\000", "\000\344\241\367\377\177\000\000", , "\000\377\377\177\000\000\037\355\336", , "\000\177\000\000\000\000\000\000\000", "\000\000\000\000\000\000\000\000\000", "\000\000\000\000\000\000\000\000\r\020", "\000\000\000\000\000\000\000\000\000"} 

La parte de mi función principal que verifica si la cuadrícula es válida, es:

  bool check = (checknxn(grid)); if(check == false) { fprintf(stderr, "Invalid Input!\n"); exit(0); } 

La función checknxn:

 bool checknxn(char grid[10][10]) { int columns = 0; for(int i=0;i<10;i++) { if(grid[0][i]!=NULL) columns++; else { break; } } for(int i=1;i<10;i++) { for(int j=columns;j<10;j++) { if(grid[i][j]!=NULL) return false; } } int rows = 0; for(int i=0;i<10;i++) { if(grid[i][0]!=NULL) rows++; else { break; } } if (!(rows == columns)) return false; for(int i=0;i<rows;i++) { for(int j=0;j<columns;j++) { if(grid[i][j]==NULL) { return false; } } } return true; } 

Esto devuelve falso y mi progtwig se cierra, aunque la cuadrícula de entrada en este caso sea válida.

No puedo entender por qué la función checknxn está devolviendo false en este caso.

ACTUALIZACIÓN: Así es como inicializo mi grilla:

 FILE *file1 = fopen(argv[1], "r"); // "r" for read char grid[10][10]; char c; for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ fscanf(file1,"%c", &c); if (c == '\n') { grid[i][j] = '\0'; break; } if (c == ' ') { grid[i][j] = '\0'; continue; } if (c == '\0') { grid[i][j] = '\0'; continue; } else { grid[i][j] = c; } } } 

Error clásico de C de no inicializar datos. Memset probablemente el camino a seguir (ver más abajo).

 memset(grid, 0, sizeof(grid[0][0]) * rows * columns); 

Su cuadrícula no está completamente inicializada (no configuró todas las celdas a, por ejemplo: \0 ), por lo que solo tiene las cadenas y el inicio de cada fila correctamente definidos. Y cuando lo haya hecho, inicializó la cuadrícula, no verificará si las celdas son NULL porque no son punteros sino contenido real, por lo tanto, compruebe, por ejemplo: \0 si ha inicializado la cuadrícula a ese valor.

EDITAR después de información adicional del OP

Para inicializar esa grilla puedes hacer algo como

 char grid[10][10]; for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ grid[i][1j] = '\0'; } } 

Y sólo entonces hacen los rellenos. No mezclarlo

Si desea verificar si cada celda está llena, es decir: no \0

  for(int i=0;i 

Pero desea cargar una cadena C en él y las cadenas C terminan con un \0 . Cargue las cadenas en las celdas sin el final \0 o ajuste los bucles para verificar hasta row_length-2 lugar de row_length -1 .

Un enfoque mucho más simple si tiene cadenas: mida la longitud de la cadena en cada fila y si son todas iguales y el número de filas corresponde a la longitud de la cadena que tiene una cuadrícula cuadrada.