我正在开发一款C级国际象棋游戏,仅仅是为了练习。在游戏开始时,用户可以键入4个内容:
<whitespace>
COL(即2 2
)如何使用scanf
预期2个整数或1个字符?
答案 0 :(得分:6)
似乎读取整行是最明智的,然后决定它包含什么。这不包括使用scanf
,因为它会使用内容stdin
流。
尝试这样的事情:
char input[128] = {0};
unsigned int row, col;
if(fgets(input, sizeof(input), stdin))
{
if(input[0] == 'h' && input[1] == '\n' && input[2] == '\0')
{
// help
}
else if(input[0] == 'q' && input[1] == '\n' && input[2] == '\0')
{
// quit
}
else if((sscanf(input, "%u %u\n", &row, &col) == 2))
{
// row and column
}
else
{
// error
}
}
答案 1 :(得分:5)
最好避免使用scanf
。它通常会导致比它解决的问题更多的麻烦。
一种可能的解决方案是使用fgets
获取整行,然后使用strcmp
查看用户是否键入“h”或“q”。如果没有,请使用sscanf
获取行和列。
答案 2 :(得分:0)
这个只是使用scanf
#include <stdio.h>
int main()
{
char c;
int row, col;
scanf("%c", &c);
if (c == 'h')
return 0;
if (c == 'q')
return 0;
if (isdigit(c)) {
row = c - '0';
scanf("%d", &col);
printf("row %d col %d", row, col);
}
return 0;
}
答案 3 :(得分:0)
int row, col;
char cmd;
char *s = NULL;
int slen = 0;
if (getline(&s, &slen, stdin) != -1) {
if (sscanf(s, "%d %d", &row, &col) == 2) {
free(s);
// use row and col
}
else if (sscanf(s, "%c", &cmd) == 1) {
free(s);
// use cmd
}
else {
// error
}
}
答案 4 :(得分:-2)
P.S。:那些没有仔细阅读并理解我的答案的人,请尊重自己,不要随意投票!
除了“获取整行然后使用sscanf”之外,通过char读取char,直到输入'\ n'也是一种更好的方法。如果程序遇到'h'或'q',它可以立即执行相关操作,同时云也可以为输入流提供实时分析。
示例:
#define ROW_IDX 0
#define COL_IDX 1
int c;
int buffer[2] = {0,0};
int buff_pos;
while( (c = getchar())) {
if (c == '\n') {
//a line was finished
/*
row = buffer[ROW_IDX];
col = buffer[COL_IDX];
*/
buff_pos = 0;
memset(buffer , 0 , sizeof(buffer));//clear the buffer after do sth...
} else if (c == 'h') {
//help
} else if (c == 'q') {
//quit
} else {
//assume the input is valid number, u'd better verify whether input is between '0' and '9'
if (c == ' ') {
//meet whitespace, switch the buffer from 'row' to 'col'
++buff_pos;
} else {
buffer[buff_pos%2] *= 10;
buffer[buff_pos%2] += c - '0';
}
}
}