В дополнение к ответу Джозефа вы приглашаете Неопределенное поведение , так как не можете подтвердить, что ваши i, j, blank_i, blank_j
индексы остаются в границах.(и * Никогда, никогда не используйте gets()
, оно было удалено из текущего стандарта Си).См .: Почему get () настолько опасен, что его никогда не следует использовать!
Вместо этого используйте fgets
и обрежьте конечный '\n'
из полученной строки, перезаписав nul-characer , например,
#define ROWS 5 /* if you need a constant, #define one (or more) */
#define COLS ROWS
char a[ROWS][COLS];
...
for(int i = 0; i < ROWS; i++){
if (i) /* skips a[0] */
if (fgets (a[i], COLS, stdin))
a[i][strcspn(a[i], "\n")] = 0; /* overwrite '\n' */
else { /* handle failed input */
fputs ("error: EOF encountered.\n", stderr);
return 1;
}
...
Далее, в следующем цикле for
вы назначаете blank_i = i;
и blank_j = j;
, например,
for (int j = 0; j < COLS; j++){
if(a[i][j] == ' ') {
blank_i = i;
blank_j = j;
}
}
Впоследствии вызатем увеличивайте a[blank_i++][blank_j];
и используйте blank_j--
и blank_j++
(вы также должны убедиться, что blank_i--
никогда не приведет к отрицательному значению).Чтобы избежать неопределенного поведения , вы должны проверить, что ваши индексы остаются в диапазоне.Например, взяв case 'B':
, вы можете сделать что-то похожее на:
case 'B':
{ /* create new block to allow variable declaration
* blank_i + 1 can exceed 4 invokding Undefined
* Behavior. You must validate/handle value.
*/
int row = blank_i + 1 % ROWS;
a[blank_i][blank_j] = a[row][blank_j];
/* same with ++blank_i */
blank_i = (blank_i + 1) % ROWS;
a[blank_i][blank_j] = ' ';
break; /* lines don't cost $, done hide break at end */
}
Поскольку вы зацикливаете while ((c = getchar()) != '0')
, оба значения blank_i
и blank_j
могут превысить границы вашего массива или привести квызов отрицательного индекса неопределенное поведение - задолго до вашей проверки:
printf("Puzzle #%d:\n", _case);
if(blank_i < 0 || blank_i > 4 || blank_j < 0 || blank_j > 4)
printf("This puzzle has no final configuration.\n");
Пройдите и исправьте свою индексацию (обрабатывая ее любым способом), чтобы убедиться, что ваши индексы остаются в пределахвашего массива.