4

我正在用 C 语言开发一个国际象棋游戏,只是为了练习。在游戏开始时,用户可以输入 4 件事:

  • ROW <whitespace>COL(即2 2
  • 'h' 寻求帮助
  • 'q' 退出

如何使用 ascanf来期望 2 个整数或 1 个字符?

4

5 回答 5

6

似乎阅读整行,然后决定它包含什么是最明智的。这不包括 using 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
    }
}
于 2013-08-20T07:23:37.390 回答
5

最好完全避免使用scanf。它通常会带来比它解决的问题更多的麻烦。

一种可能的解决方案是用于fgets获取整行,然后用于strcmp查看用户输入的是“h”还是“q”。如果没有,请使用sscanf获取行和列。

于 2013-08-20T07:21:12.647 回答
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;
}
于 2013-08-20T07:25:37.770 回答
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
    }
}
于 2013-08-20T07:26:09.167 回答
-2

PS:没有仔细阅读和理解我答案的人,请尊重自己,不要随意投反对票!

除了“获取整行然后使用 sscanf”之外,逐个字符读取直到输入 '\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';
            }
        }
    }
于 2013-08-20T07:44:09.490 回答