制限時間内のキー入力検査
Posted feedbacks - C
真っ先に投稿があると思っていたCがなかなかこないので投稿(笑 環境がcygwinのせいかcursesのライブラリがうまく動かず、 それならばと int 16hしてみたがやっぱりダメ;; ということで、termiosを使いました。 あといらんコード混ぜて見た目ちょっとだけかっこよくしてみた(笑 //gcc -Wall -std=c99 doukaku64.c -o test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <stdio.h>
#include <string.h>
#include <time.h>
#include <sys/syslimits.h>
#include <unistd.h>
#include <termios.h>
int InputChecker(time_t sec, const char *str)
{
size_t length = strlen(str); // オリジナルの文字数
char in[ LINE_MAX+1 ]; // 入力文字列
size_t len; // 入力文字数
time_t t; // 入力時間
struct termios tos, tos_org;
tcgetattr( 0, &tos ); tos_org = tos;
memset(in, '\0', sizeof(in));
printf("input:[%s] => 入力待ち\r", str); fflush(stdout);
printf("input:[%s] => ", str); fflush(stdout);
tos.c_lflag &= ~(ICANON | ECHO);
// tos.c_lflag |= ECHO;
tos.c_cc[VMIN] = 1;
tos.c_cc[VTIME] = 0;
tcsetattr( 0, TCSADRAIN, &tos );
read( 0, &in[0], sizeof(char) );
printf("\rinput:[%s] =>%12s\r", str, ""); fflush(stdout);
printf("input:[%s] =>%c", str, in[0]); fflush(stdout);
t = time(NULL);
tos.c_lflag |= (ICANON | ECHO);
tos.c_cc[VMIN] = 0;
tos.c_cc[VTIME] = 0;
tcsetattr( 0, TCSADRAIN, &tos );
read( 0, &in[1], LINE_MAX );
t = time(NULL) - t;
len = strlen( in );
if( in[len-1] == '\n' ) in[len-1] = '\0';
if( in[len-2] == '\r' ) in[len-2] = '\0';
if( t <= sec )
{
if( strcmp(str, in) == 0 )
{
printf("result: OK\n");
}
else
{
printf("result: NG / input:[%s]\n", in);
}
}
else
{
printf("result: TIME OUT\n");
}
tcsetattr( 0, TCSADRAIN, &tos_org );
return 0;
}
int main(int argc, char *argv[])
{
InputChecker(5, "ABCDEF");
InputChecker(2, "AAA");
InputChecker(0, "A");
return 0;
}
|
久々に書いてみた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <stdio.h>
#include <conio.h>
#include <time.h>
#include <string.h>
void inputchecker(int sec,char* str){
char s[256];
int count;
char c;
clock_t start,now;
//Key buffer Clear
while(kbhit()) getch();
cprintf("Input(%s)=>",str);
count=0;
c=0xFF;
do{
if(kbhit()){
if (count==0) start=clock();
now=clock();
c=getch();
if(c=='\r'){
c='\0';
puts("<ENTER>");
}else{
putch(c);
}
s[count++]=c;
}
}while(c);
printf("result => ");
if((now-start)/CLOCKS_PER_SEC>5) puts("TIME OUT");
else if (strcmp(str,s)==0) puts("OK");
else puts("NG");
}
int main(){
inputchecker(5,"ABCDEF");
getch();
return 0;
}
|


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 ]