自己写的日语复习程序 程序可以运行,但是按了键盘后程序运行异常

dingdingdao2 2014-03-02 01:26:10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <process.h>
#include <math.h>
#include <unistd.h>

int ISTIMEPASS = 0; //时间循环结束触发器
int TIMEFUNABORT = 0; //时间循环函数终止
int ISKEYPRINT = 0; //键盘按键按下
int KEYFUNABORT = 0; //键盘循环函数终止

//检测按键函数 子线程调用函数
void KeyPrint( void* Argu )
{
fflush( stdin );
while(1)
{
if( KEYFUNABORT == 1 )
return;
else if( kbhit() != 0 )
{
ISKEYPRINT = 1;
return;
}
}
}

//检测超时函数 子线程调用函数
void RunTime( void* Argu )
{
int nTimeBegin = clock();
int nTimeEnd;
while(1)
{
nTimeEnd = clock();
if( abs( nTimeEnd - nTimeBegin ) >= 16000 )
{
ISTIMEPASS = 1;
return;
}
else if( TIMEFUNABORT == 1 )
return;

}
}

//打印整个日语的发音
void printAnnounce( int nReviewNum )
{
//为随机产生不同的随机数播种子
srand( (unsigned)time(NULL) );

//将随机产生的随机数(1-10)对应的发音打印出来
int nNum = rand()% ( nReviewNum + 1 ) + 1;

switch( nNum )
{
case 1:
puts( "a" );
break;
case 2:
puts( "i" );
break;
case 3:
puts( "u" );
break;
case 4:
puts( "e" );
break;
case 5:
puts( "o" );
break;
case 6:
puts( "ka" );
break;
case 7:
puts( "ki" );
break;
case 8:
puts( "ku" );
break;
case 9:
puts( "ke" );
break;
case 10:
puts( "ko" );
break;
case 11:
puts( "sa" );
break;
case 12:
puts( "si---s" );
break;
case 13:
puts( "su" );
break;
case 14:
puts( "se" );
break;
case 15:
puts( "so" );
break;
case 16:
puts( "ta" );
break;
case 17:
puts( "tsi----s" );
break;
case 18:
puts( "te" );
break;
case 19:
puts( "to" );
break;
case 20:
puts( "na" );
break;
case 21:
puts( "ni" );
break;
case 22:
puts( "nu" );
break;
case 23:
puts( "ne" );
break;
case 24:
puts( "no" );
break;
case 25:
puts( "ha" );
break;
case 26:
puts( "hi" );
break;
case 27:
puts( "fu" );
break;
case 28:
puts( "he" );
break;
case 29:
puts( "ho" );
break;
case 30:
puts( "ma" );
break;
case 31:
puts( "mi" );
break;
case 32:
puts( "mu" );
break;
case 33:
puts( "me" );
break;
case 34:
puts( "mo" );
break;
case 35:
puts( "ya" );
break;
case 36:
puts( "i" );
break;
case 37:
puts( "yu" );
break;
case 38:
puts( "e" );
break;
case 39:
puts( "yo" );
break;
case 40:
puts( "ra" );
break;
case 41:
puts( "ri" );
break;
case 42:
puts( "ru" );
break;
case 43:
puts( "re" );
break;
case 44:
puts( "ro" );
break;
case 45:
puts( "wa" );
break;
case 46:
puts( "i" );
break;
case 47:
puts( "u" );
break;
case 48:
puts( "e" );
break;
case 49:
puts( "o" );
break;
default :
printf(" wrong Num: %d\n", nNum);
}
}

int main()
{
//获得要复习的单词的个数
int nReviewNum = 0;
printf( "输入要复习的单词的个数:" );
scanf( "%d", &nReviewNum );

//清屏标志
int ncount = 0;
//无限循环输出音
while( 1 )
{
if( ncount == 5 )
{
system( "cls" );//清屏
ncount = 0;
}


//打印一个字符。
printAnnounce( nReviewNum );
ncount++;

//开启另一个线程负责统计时间+ 主线程负责监视键盘。当有一个启动时打印下一个字符发音
_beginthread( RunTime, 0, NULL );
_beginthread( KeyPrint, 0, NULL );

while( 1 )
{
if( ISTIMEPASS == 1 ) //超时
{
KEYFUNABORT = 1; //终止KeyFun子线程
break;
}
else if( ISKEYPRINT == 1 )
{
TIMEFUNABORT = 1; //终止RunTime子线程
break;
}
}

//全局数据恢复原状
ISTIMEPASS = 0;
TIMEFUNABORT = 0;
ISKEYPRINT = 0;
KEYFUNABORT = 0;

//等待2秒钟等待子线程回收完毕
Sleep( 2000 );
}

system("pause");
return 0;
}

上面的程序可以运行,在不按键盘的时候每隔一段时间出现下一个日语读音。但是当我按了键盘后日语读音出现的就很快了。不知道哪里出来的异常。
...全文
154 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-03-12
  • 打赏
  • 举报
回复
仅供参考:
#include <conio.h>
#include <windows.h>
int main() {
    int k;

    while (1) {
        if (kbhit()) {
            k=getch();
            if (0==k || 0xE0==k) k=k<<8|getch();
            if (27==k) break;//按Esc键退出
            cprintf("\r\n%04X\r\n",k);
        }
        Sleep(200);
        cprintf(".");
    }
    return 0;
}
merlinfang 2014-03-11
  • 打赏
  • 举报
回复
kbhit()函数不清空缓存,也就是在按键后没有读取内容的话,缓存中一直有内容

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧