制限時間内のキー入力検査
Posted feedbacks - C#
秒数はあまり正確でないです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | using System;
using System.Threading;
class Program {
static void InputCheck(int n, string s) {
Console.Write("input({0}) => ", s);
while (!Console.KeyAvailable) Thread.Sleep(100);
DateTime timeout = DateTime.Now.AddSeconds(n);
string match = s.Equals(Console.ReadLine()) ? "OK" : "NG";
Console.WriteLine("result => {0}", DateTime.Now < timeout ? match : "TIME OUT");
}
static void Main(string[] args) {
InputCheck(5, "ABCDEFG");
InputCheck(4, "HIJKLMN");
InputCheck(3, "OPQRSTUVWXYZ");
}
}
|
KeyAvailableがtrueでも、ReadLine, Readは、Enterキー待ちになるので組み合わせるな、と解釈しましたが…
他の理由で組み合わせるなと書いてる可能性も、無いとはいえないですね。
ReadKeyを使ったのも書いて比べてみました。
動作の違いは、ReadLineは整形済みの文字列の入力であるのに対し、ReadKeyは、コード単位の入力になります。
具体的には、バックスペースが'\b'として入力される、日本語入力には、対応するエンコーディングの変換が必要、など。
なので、このコードはASCIIコードのみ対応で、打ち間違いは許されません。
他の理由で組み合わせるなと書いてる可能性も、無いとはいえないですね。
ReadKeyを使ったのも書いて比べてみました。
動作の違いは、ReadLineは整形済みの文字列の入力であるのに対し、ReadKeyは、コード単位の入力になります。
具体的には、バックスペースが'\b'として入力される、日本語入力には、対応するエンコーディングの変換が必要、など。
なので、このコードはASCIIコードのみ対応で、打ち間違いは許されません。
1 2 3 4 5 6 7 8 9 10 11 12 13 | static void InputChecker(int n, string s) {
StringBuilder sb = new StringBuilder(s.Length * 2);
Console.Write("input({0}) => ", s);
ConsoleKeyInfo key = Console.ReadKey();
DateTime timeout = DateTime.Now.AddSeconds(n);
while (key.Key != ConsoleKey.Enter) {
sb.Append(key.KeyChar);
key = Console.ReadKey();
}
string match = s.Equals(sb.ToString()) ? "OK" : "NG";
Console.WriteLine();
Console.WriteLine("result => {0}", DateTime.Now < timeout ? match : "TIME OUT");
}
|




raynstard
#3420()
Rating0/2=0.00
関数 InputCheckerは、以下の仕様を満たしてください。
たとえば、「InputCheker(5, "ABCDEF")」と指定した場合、 出力例はこんな感じです。
1. input(ABCDEF) =>と出力して入力待ちをし、ユーザーが「ABCDEF<ENTER>」を入力したとき、 入力開始から5秒以内ならば「OK」、5秒をこえていれば「TIME OUT」を出力します。 このとき、ユーザーがキーを押下しなければ1. を出力してから たとえ10秒たっていても「TIME OUT」にはならないので注意してください。 時間計測はあくまでユーザーが入力を開始してからです。
このお題はraynstardさんの投稿です。ご協力ありがとうございます。
[ reply ]