关于处理scanf的无效输入的问题

时间:2019-06-10 20:11:45

标签: c scanf

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函数时,我希望读取并接收两个char。例如,“ AB”将是有效的端子输入。但是在这种情况下,我希望我的代码能够检测到诸如“ ABC”之类的无效输入并相应地通知用户。上面的以下代码不适用于有效输入和无效输入,但我不知道为什么。任何见解将不胜感激。另外,我如何可能能够检测到其他无效输入,例如“ A”或“”,并能够相应地通知用户?

1 个答案:

答案 0 :(得分:1)

使用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;
}