4

練習のためだけに C でチェス ゲームを開発しています。ゲームの開始時に、ユーザーは 4 つのことを入力できます。

  • ROW <whitespace>COL (つまり2 2)
  • 「h」でヘルプ
  • 終了するには「q」

scanfa を使用して 2 つの整数または 1 つの文字を期待するにはどうすればよいですか?

4

5 に答える 5

6

行全体を読んでから、その内容を判断するのが最も賢明なようです。scanfこれには、コンテンツstdinストリームを消費するため、 using は含まれません。

このようなことを試してください:

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です。それは通常、解決するものよりも多くの問題を引き起こします。

考えられる解決策の 1 つは、 を使用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 に答える