2016-10-03 3 views
0

Я заполняю сетку символов 10 x 10 из входного файла. мне нужно проверить, если сетка представляет собой квадрат (т.е. имеет N х N символов, где N < = 10)c - Проверка на нуль в массиве 2d

входного файла, например:

pitk 
olpe 
pkey 
tope 

При печати сетки в БГД , я получаю следующий результат:

$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", <incomplete sequence \336>, 
     "\000\377\377\177\000\000\037\355\336", <incomplete sequence \367>, 
     "\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"} 

часть моей основной функции, которая проверяет, является ли сетка действительно, является:

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

Функция 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; 
} 

Это возвращает ложь, и моя программа завершает работу, даже если входной сетки в данном случае является действительным.

Я не могу понять, почему функция checknxn возвращает false в этом случае.

UPDATE: Это, как я инициализировать свою сетку:

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; 
     } 
    } 
    } 
+0

Вы пробовали свой отладчик (или даже printf?). Учитывая ваш вход, я могу понять, почему он терпит неудачу.Возможно, начните с переименования 'i' и' j' в 'row' и' col', чтобы сделать его немного легче следовать ... – John3136

+0

@ John3136 Я использовал свой отладчик для проверки значения сетки, но не использовал это функция checknxn, поскольку я не уверен, как использовать gdb для вспомогательной функции. – RockAndaHardPlace

+0

просто входите в него. – John3136

ответ

1

Classic C ошибка не инициализации данных. Меметт, вероятно, способ пойти (см. Ниже).

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

Вашей сетка не полностью инициализирован (вы не установили каждую ячейки, например: \0), поэтому у вас есть только строка и начало каждой строки правильно определено. И когда вы это сделали, инициализируйте сетку, то есть вы не проверяете наличие ячеек NULL, потому что они не являются указателями, а фактическим содержимым, поэтому вы проверяете, например: \0, если вы инициализировали сетку для этого значения.

EDIT после получения дополнительной информации от OP

Чтобы инициализировать эту сетку вы можете сделать что-то вроде

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

И только потом делать пломбы. Не смешивайте его.

Если вы хотите проверить, если каждый ячейка заполнена, то есть: не \0

for(int i=0;i<rows;i++) { 
    for(int j=0;j<columns;j++) { 
     if(grid[i][j] != `\0`) { 
     return false; 
     } 
    } 
    } 

Но вы хотите загрузить C-строку в нем и C-строки заканчиваются \0. Либо загрузите строки в ячейки без заднего \0, либо отрегулируйте петли, чтобы проверить до row_length-2 вместо row_length -1.

Более простой подход, если у вас есть строки: измерьте длину строки в каждой строке , и если они все одинаковы, а количество строк соответствует длине строки, у вас есть квадратная сетка.

+0

Я попытался инициализировать мою сетку, чтобы иметь «\ 0» вместо NULL (см. UPDATE выше) и мою функцию checknxn, чтобы проверить это, но у меня все еще такая же проблема ... – RockAndaHardPlace

Смежные вопросы