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”或“”,并能够相应地通知用户?
答案 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;
}