Ответ от адейшей содержит решение вашей проблемы. Я просто хотел, если позволите, сделать несколько замечаний, которые могут оказаться полезными.
Использование goto
Сначала используется ключевое слово goto
. Обычно считается плохой практикой использовать его в цикле, как у вас. Вам лучше не использовать его, а использовать другую условную структуру. Например ( см. Здесь ),
// See it in action here https://ideone.com/xM15y8
do
{
printf("Enter the number of the cell y....");
scanf("%d", &position);
const bool input_is_valid = (position == -1) || ((position > 0) && (position < 10));
if (input_is_valid)
break;
printf("\nInput invalid, try again\n");
} while(true);
Я добавил проверку ввода нуля, поскольку это также неверный ввод в вашу программу, насколько я вижу.
Использование scanf()
Вы можете сделать еще одно улучшение. Существует проблема с scanf()
... стандарт гласит:
... результат преобразования помещается в объект, на который указывает первый аргумент после аргумента формата, который еще не получил результат преобразования. Если этот объект не имеет подходящего типа или если результат преобразования не может быть представлен в объекте, поведение не определено ...
Таким образом, если бы пользователь набрал что-то вроде 8589934592, хотя это явно было бы довольно глупо, то невозможно сказать, что может содержать переменная position
, поскольку введенное значение не может быть представлено int
, потому что оно слишком велик Более безопасный способ - использовать fgets()
для чтения стандартного ввода в маленький буфер, а затем использовать strtol()
для анализа ввода.
Размер платы ограничен
Еще одно ограничение функции CreateBoard()
заключается в том, что она принимает плату любого размера, но функция позволяет вводить только позиции 1 - 9. Оператор switch
не может сделать ничего, кроме этого. С этим можно справиться двумя способами.
Индекс строки на вашей доске - это целочисленное деление zero_indexed_position/num_cols
. Это переводится как (position - 1) / n
.
Индекс столбца является остатком вышеупомянутого - (position - 1) % n
.
Таким образом, мы могли бы написать, вместо switch
( проверено здесь ),
const int row = (position - 1) / n;
const int col = (position - 1) % n;
scanf(" %c", &board[row][col]);
Другим способом было бы индексировать плату с помощью *((int *)board + (position -1))
, используя преимущества расположения массива в памяти.