Вопрос о работе с неверными входами scanf - PullRequest
0 голосов
/ 10 июня 2019
void placeg(game** g){
  //place marble;
  char row, col;
  char* buffer = NULL;
  printf("Please enter a move: ");
  scanf(" %c%c%s", &row, &col, buffer);
  // scanf(" %s", buffer);
  pos p = make_pos(charToInt((int)row),charToInt((int)col));
  place_marble((*g),p);
  board_show((*g)->b);
}

Когда я запускаю функцию scanf выше в терминале, я ожидаю прочитать и взять два символа. Например, «AB» будет допустимым входом терминала. Но в этом случае я хочу, чтобы мой код мог обнаруживать неверные данные, такие как «ABC», и соответственно информировать пользователя. Следующий код выше не работает как для действительных, так и для недействительных входных данных, но я не знаю почему. Любая идея будет принята с благодарностью. Кроме того, как я мог бы потенциально обнаружить другие виды недействительных входных данных, таких как «A» или «», и соответственно информировать пользователя?

1 Ответ

1 голос
/ 11 июня 2019

Используйте fgets для ввода.Разбор по мере необходимости.sscanf - это всего лишь одна опция для синтаксического анализа.
При этом используются действительные строки от A до I и от 1 до 9 для допустимых столбцов.Это можно изменить для фактических требований.
Если для ввода используется fgets, для всех вводов используйте fgets.Не смешивайте с scanf.

#include <stdio.h>

int main ( void) {
    char input[128] = "";
    char row = 0;
    char col = 0;
    char nl = 0;
    int result = 0;

    do {
        printf ( "Enter row and col\n");
        if ( fgets ( input, sizeof input, stdin)) {
            if ( 3 == ( result = sscanf ( input, "%c%c%c", &row, &col, &nl))) {
                if ( '\n' != nl) {//not a newline
                    result = 0;
                }
                if ( row < 'A' || 'I' < row) {//A - I valid
                    result = 0;
                }
                if ( col < '1' || '9' < col) {//1 - 9 valid
                    result = 0;
                }
            }
        }
        else {
            fprintf ( stderr, "fgets EOF\n");
            return 0;
        }
    } while ( 3 != result);

    printf ( "row: %c\ncol: %c\n", row, col);

    return 0;
}
...