練習のためだけに C でチェス ゲームを開発しています。ゲームの開始時に、ユーザーは 4 つのことを入力できます。
- ROW
<whitespace>
COL (つまり2 2
) - 「h」でヘルプ
- 終了するには「q」
scanf
a を使用して 2 つの整数または 1 つの文字を期待するにはどうすればよいですか?
行全体を読んでから、その内容を判断するのが最も賢明なようです。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
}
}
絶対に使わないほうがいいscanf
です。それは通常、解決するものよりも多くの問題を引き起こします。
考えられる解決策の 1 つは、 を使用fgets
して行全体を取得してから、 を使用strcmp
してユーザーが 'h' または 'q' を入力したかどうかを確認することです。sscanf
そうでない場合は、行と列を取得するために使用します。
これは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;
}
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
}
}