有关c++基础的一个提问

gsear 2024-02-11 12:41:37
void start()
{
	char answer1[18]= "--> yes        No";
	char answer2[18] = " yes       --> No";
	char k_a = 'a', k_d = 'd';//设置响应键
	while (1)
	{
		if (status == 0)//status是在函数外面设置的静态变量,初始化为0
		{
			cout << "wanna start ?" << endl;
			cout << answer1;
		}
		else
		{
			cout << " wanna start?" << endl;
			cout << answer2;
		}
		char ch1, ch2;//
		if (_kbhit())//读取a或者d按键来改变输出界面
		{
			ch1 = _getch();
			if (ch1 == (k_a || k_d))
				if (status == 0)
					status = 1;
				else
					status = 0;//
		}
		delay(200);//延时响应的函数,不设置的话画面会一直闪
		if (_kbhit())
		{
			ch2 = _getch();
			if (ch2 == 27)//读取到esc键退出循环
				break;
		}
		system("cls");//清屏的函数
	}
}

如上代码,我是想做一个可以通过输入a d然后来改变箭头位置的函数,但是写完后运行很奇怪的是————我输入a或者d后,输出界面就是不会及时的响应啊,要么就是我按两下没什么反应,要么就是我一直连点后一段时间里一直在变,很奇怪,大家有人能告知下是为什么吗,然后就是我要改得怎么改,谢谢大家了

...全文
245 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

您遇到的问题是由于_kbhit()函数的特性造成的。该函数只会检查键盘缓冲区中是否有按键,而不会立即读取按键。因此,当您按下a或d键时,程序可能需要等待一段时间才能检测到按键,导致响应延迟。

要解决这个问题,您可以使用_getch()函数来立即读取按键。_getch()函数会阻塞程序,直到用户按下按键,然后将按键值返回给程序。

以下是修改后的代码:

void start()
{
    char answer1[18]= "--> yes    No";
    char answer2[18] = " yes    --> No";
    char k_a = 'a', k_d = 'd';//设置响应键
    while (1)
    {
        if (status == 0)//status是在函数外面设置的静态变量,初始化为0
        {
            cout << "wanna start ?" << endl;
            cout << answer1;
        }
        else
        {
            cout << " wanna start?" << endl;
            cout << answer2;
        }

        char ch = _getch();
        if (ch == k_a)
            status = 1;
        else if (ch == k_d)
            status = 0;
        else if (ch == 27)
            break;

        system("cls");
    }
}

修改后的代码中,我们使用_getch()函数来立即读取按键。这样,当您按下a或d键时,程序会立即响应并改变输出界面。

此外,我们还可以使用delay()函数来控制响应速度。例如,我们可以将delay()函数的参数改为100,这样可以使响应速度更快。

void start()
{
    char answer1[18]= "--> yes    No";
    char answer2[18] = " yes    --> No";
    char k_a = 'a', k_d = 'd';//设置响应键
    while (1)
    {
        if (status == 0)//status是在函数外面设置的静态变量,初始化为0
        {
            cout << "wanna start ?" << endl;
            cout << answer1;
        }
        else
        {
            cout << " wanna start?" << endl;
            cout << answer2;
        }

        char ch = _getch();
        if (ch == k_a)
            status = 1;
        else if (ch == k_d)
            status = 0;
        else if (ch == 27)
            break;

        delay(100);

        system("cls");
    }
}

希望这对您有所帮助。

Nowl 7天前
  • 打赏
  • 举报
回复
if(ch1==(k_a||k_d))

改成

if (ch1 == k_a ||ch1== k_d)
gsear 5天前
  • 举报
回复
@Nowl 这里是错的,但不是主要的错的地方,因为有两个_kbhit函数,有时候会被另一个给捕捉了导致输入不被响应
  • 打赏
  • 举报
回复
        if(ch1==(k_a||k_d))

改成if (ch1 == k_a ||ch1== k_d)

gsear 02-11
  • 打赏
  • 举报
回复

@AI

69,283

社区成员

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

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