首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么msvcrt.getch()在不按任何键的情况下总是得到相同的输入

msvcrt.getch() 是 Microsoft Visual C++ 运行时库中的一个函数,用于从控制台读取一个字符,而不需要按回车键。这个函数通常用于创建交互式程序,如游戏或菜单系统,其中用户可以即时响应按键而不需要等待回车键。

基础概念

msvcrt.getch() 函数的工作原理是读取控制台的输入缓冲区。当用户按下键盘上的一个键时,该键的扫描码会被发送到控制台,并存储在输入缓冲区中。getch() 函数会读取这个扫描码并返回它。

相关优势

  1. 即时响应:用户不需要按回车键就可以立即得到响应。
  2. 隐藏输入:默认情况下,getch() 不会在屏幕上显示输入的字符,这对于密码输入等场景非常有用。
  3. 跨平台兼容性:虽然 msvcrt 是 Windows 特定的库,但类似的函数在其他平台上也有实现,如 Unix 系统上的 ncurses 库。

类型与应用场景

  • 类型:这是一个同步函数,它会阻塞程序的执行直到用户按下某个键。
  • 应用场景:适用于需要即时用户输入的游戏、交互式命令行工具、密码输入框等。

问题原因

如果你发现 msvcrt.getch() 在不按任何键的情况下总是得到相同的输入,这通常是由于以下几个原因之一:

  1. 输入缓冲区问题:可能有未处理的按键仍然停留在输入缓冲区中,导致 getch() 读取到的是之前的按键。
  2. 程序逻辑问题:可能在某些情况下,程序逻辑错误地重复调用了 getch(),或者在循环中没有正确处理按键事件。
  3. 环境因素:在某些集成开发环境(IDE)或特定的终端模拟器中,可能会有特殊的按键处理逻辑,导致 getch() 行为异常。

解决方法

  1. 清除输入缓冲区:在调用 getch() 之前,可以使用 msvcrt.kbhit() 检查是否有按键,并使用 msvcrt.getch() 清除这些按键。
  2. 清除输入缓冲区:在调用 getch() 之前,可以使用 msvcrt.kbhit() 检查是否有按键,并使用 msvcrt.getch() 清除这些按键。
  3. 检查程序逻辑:确保在循环中正确处理按键事件,避免重复读取相同的按键。
  4. 检查程序逻辑:确保在循环中正确处理按键事件,避免重复读取相同的按键。
  5. 使用不同的终端或IDE:尝试在不同的终端模拟器或IDE中运行程序,看看问题是否仍然存在。

通过这些方法,你应该能够解决 msvcrt.getch() 在不按任何键的情况下总是得到相同输入的问题。

相关搜索:无论我是否输入y/n,我总是得到相同的结果。为什么?如何让控制台等待,然后在不按任何键的情况下继续?为什么在fortran中使用函数和contains时总是得到相同的结果在python 3 (Windows)中,在不按Enter键的情况下使用带超时的输入提示来计算输入在不丢失键的情况下按值对LinkedHashMap<String、Json>排序在不按enter键的情况下,在添加CIN值后立即获取文本为什么这个函数在不考虑输入的情况下返回相同的值?如何让JavaScript在不按键盘的情况下按下键盘上的键?js为什么这段代码在没有任何输入的情况下启动时显示'A‘?AwesomeWM:在不按Enter/Esc键的情况下在代码中关闭提示框在不按Enter键或移动焦点的情况下应用新单元格值在Elixir中,如何在不按Enter键的情况下获取单个字符?为什么在我的功能文件的后台部分之后,我得到了以下错误:"required(..)+ loop不匹配输入场景中的任何内容:“?有没有一种方法可以在不按Ctrl键的情况下在ObjectListView中进行多选?如何在不按CTRL键的情况下使用ASP.NET在选择元素中选择多个项目?为什么这些代码行导致我的程序只在我输入两次后才接受输入(每次输入后按enter键)?为什么可以在不包含任何模块的情况下使用current_user、authenticate_user!等辅助方法当我运行这段代码时,为什么这段c代码不能接受输入。这个程序在没有任何输入的情况下就存在了在禁用输入字段的情况下填充1个字符时,自动按Tab键切换到下一个输入字段pyinstaller exe等待用户在命令提示符下输入任何键,然后继续下一次迭代。如何在不输入任何密钥的情况下保持它的运行
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

10-2 控制进程

1.中断进程 (1)Ctrl-C ① 作用 在终端里按下 Ctrl-C 键将会中断一个程序,它意味着我们委婉地请求程序结束。...首先,输入 xlogo 命令,并确保程序在正常运行;接着,返回到终端窗口,按下Ctrl-C键。 2....后台运行进程不会受到任何键盘输入的影响,包括试图用来中断它的 Ctrl-C 键。 (2)怎么做? 要想在启动程序时让程序在后台运行,可以在命令后面加上 &(和号字符)来实现。...3.fg-使进程回到前台运行 后台运行进程不会受到任何键盘输入的影响,包括试图用来中断它的 Ctrl-C 键。...① 示例 让我们试试如下操作,在命令提示符后输入 xlogo,按下 Enter 键后再按下 Ctrl-Z ,就可以将进程停止(暂停)。

74540
  • 数据结构思维 第十三章 二叉搜索树

    我们处理的两个案例与上一个分支相同。最后,如果cmp == 0,我们在树中找到了键,那么我们更改它并返回旧的值。...如果node是null,这意味着子树是空的,所以我们返回,而不向set添加任何东西。否则我们: 按顺序遍历左子树。 添加node.key。 按顺序遍历右子树。...递归地应用相同的参数,我们知道左子树中的元素是有序的,右子树中的元素也一样。并且边界情况是正确的:如果子树为空,则不添加任何键。所以我们可以认为,该方法以正确的顺序添加所有键。...每次我们调用它时,我们得到一个更大的数字。当我们将这些时间戳转换为字符串时,它们按字典序增加。...在节点数相同的不平衡树中,高度为15。 13.6 自平衡树 这个问题有两种可能的解决方案: 你可以避免向Map按顺序添加键。但这并不总是可能的。

    27910

    getchar的使用

    实际上是 输入设备->内存缓冲区->程序getchar 你按的键是放进缓冲区了,然后供程序getchar 你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存进缓冲区...个字符.如果需要取消’\n’的影响,可以用getchar();来清除,这里getchar();只是取得了’\n’但是并没有赋给任何字符变量,所以不 会有影响,相当于清除了这个字符.还要注意的是这里你在键盘上输入...3、那么我们为什么要使用缓冲区呢? 举个例子,我们知道计算机CPU的处理速度很快的,而我们键盘的输入速度总是比不过CPU的处理速度,那么CPU就得一直等着键盘输入完,这样很浪费资源。...2、行缓冲   在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。   ...然而,这个输入缓冲区的设计,是把所有从键盘上输入的东西都放进去的,包括你每次按的回车符‘\n’, 而getchar函数只读走了你在回车前输入的那个字符,而将回车符保留在了输入缓冲区中。

    84250

    Activity堆栈管理

    当用户按下返回键时,第二个activity从栈中弹出,第一个activity又在当前屏幕显示。...当用户按下HOME键返回到程序启动器(application launcher)后,选择了一个新的应用程序(事实上是一个新的task),当前的task就被转移到后台,新的task中的根activity将被显示在屏幕上...由于该模式下activity总是位于栈顶,所以actvity在同一个设备里至多只有一个实例 允许。singleTask模式的activity总是位于栈底位置。...打个比方,如果不包含带MAIN和LAUNCHER过滤器,某个activity运行了一个singleTask模式的 activity,初始化了一个新的task,当用户按下HOME键时,那个activity...类似的情况在FLAG_ACTIVITY_NEW_TASK标记上也会出现。如果这个标记会新建一个task,当用户按下HOME键时,必须有一种方式能够让用户返回到那个activity。

    1.2K100

    HashMap你真的了解吗?

    然后,该函数遍历列表以查找具有相同键的条目(使用键的 equals() 函数)。 在 get() 的情况下,该函数返回与条目关联的值(如果条目存在)。...在 put(K key, V value) 的情况下,如果条目存在,则函数将其替换为新值,否则它会在单链表的头部创建一个新条目(根据参数中的键和值)。...16 的二进制表示为 0…010000,因此对于任何哈希值 H,使用按位公式“H AND 16”生成的索引将是 16 或 0。...在增加之前,为了得到Entry E,map 必须遍历一个包含5 个元素的列表。调整大小后,相同的 get() 只是遍历 2 个元素的链表,调整大小后 get() 快 2 倍!...在最坏的情况下(如果大多数数据都在同一个桶中),您最终可能会得到 O(n) 的时间复杂度。 这是一个视觉示例。第一张图显示了一个倾斜的 HashMap,第二张图是一个平衡良好的图。

    2.2K30

    27 个问题,告诉你Python为什么这么设计

    目录 为什么Python使用缩进来分组语句? 为什么简单的算术运算得到奇怪的结果? 为什么浮点计算不准确? 为什么Python字符串是不可变的? 为什么在方法定义和调用中显式使用“self”?...例如,在输入以下语句后: >>> x = 1.2 为 x 存储的值是与十进制的值 1.2 (非常接近) 的近似值,但不完全等于它。...CPython退出时为什么不释放所有内存? 当Python退出时,从全局命名空间或Python模块引用的对象并不总是被释放。...但是,由于无论谁更改键对象都无法判断它是否被用作字典键值,因此无法在字典中修改条目。然后,当你尝试在字典中查找相同的对象时,将无法找到它,因为其哈希值不同。...元组是不可变的,因此可以用作字典键。 已经提出的一些不可接受的解决方案: 哈希按其地址(对象ID)列出。

    6.7K11

    Attention机制竟有bug,Softmax是罪魁祸首,影响所有Transformer

    注意力单元中的 softmax 使其可以将键 / 查询匹配作为概率;这些概率支持一个键 - 值查找的连续值版本(我们得到的权重不是一个查找的 1/0 输出,而是高权重 = 所需的键 - 值查找)。...但是,实际上 Transformer 的工作原理是这样的:它将输入向量转换为大小相同的输出向量,最终的 6KB 输出向量用来预测下一个 token。...接下来,Miller 介绍了 softmax 是如何在注意力中使用的,从而发现问题到底出现在哪里: 对上述公式进行分解,在仅解码器模型中,、和源自相同的输入序列。它们又不完全相同,即投影方式不同。...但在每一层中,它们都以相同的注释嵌入向量开始。 ^项用于寻找不同位置 token 向量之间的相关性,实质上构建了一个相关性矩阵(点积按 缩放),其中每一列和每一行对应一个 token 位置。...Miller 认为很快可以整合一项测试:如果你在每个输入上下文的前面加上一个零向量,并确保你选择的神经网络不添加任何偏差(包括位置编码),那么零在通过时不会改变,并对每个后续的 softmax 分母添加

    33830

    Attention机制竟有bug?Softmax是罪魁祸首,影响所有Transformer

    注意力单元中的 softmax 使其可以将键 / 查询匹配作为概率;这些概率支持一个键 - 值查找的连续值版本(我们得到的权重不是一个查找的 1/0 输出,而是高权重 = 所需的键 - 值查找)。...但是,实际上 Transformer 的工作原理是这样的:它将输入向量转换为大小相同的输出向量,最终的 6KB 输出向量用来预测下一个 token。...接下来,Miller 介绍了 softmax 是如何在注意力中使用的,从而发现问题到底出现在哪里: 对上述公式进行分解,在仅解码器模型中,、和源自相同的输入序列。它们又不完全相同,即投影方式不同。...但在每一层中,它们都以相同的注释嵌入向量开始。 ^项用于寻找不同位置 token 向量之间的相关性,实质上构建了一个相关性矩阵(点积按 缩放),其中每一列和每一行对应一个 token 位置。...Miller 认为很快可以整合一项测试:如果你在每个输入上下文的前面加上一个零向量,并确保你选择的神经网络不添加任何偏差(包括位置编码),那么零在通过时不会改变,并对每个后续的 softmax 分母添加

    27520

    如何在命令行中监听用户输入文本的改变?

    这真是一个诡异的需求。为什么我需要在命令行中得知用户输入文字的改变啊!实际上我希望实现的是:在命令行中输入一段文字,然后不断地将这段文字发往其他地方。...本文将介绍如何监听用户在命令行中输入文本的改变。 ---- 在命令行中输入有三种不同的方法: Console.Read() 用户可以一直输入,在用户输入回车之前,此方法都会一直阻塞。...Console.ReadKey() 用户输入之前此方法会一直阻塞,用户只要按下任何一个键这个方法都会返回并得到用户按下的按键信息。...例如,我们按下退格键(BackSpace)可以删除光标的前一个字符,按下删除键(Delete)可以删除光标的后一个字符,按下左右键可以移动光标到合适的文本上。...这就意味着我们使用 "\b \b" 来删除我们输入的字符的时候,有可能在一些字符的情况下我们需要删除两个字符宽度。 然而如何获取一个字的字符宽度呢?还是很复杂的。

    3.4K10

    Linux基础指令及其作用之文件内容查看和处理

    more 是一个简单的分页工具,允许用户按页查看文件内容。 more [选项] 文件 常用操作 空格键:向下滚动一屏。 Enter 键:向下滚动一行。 b 键:向上滚动一屏。...文件:是要搜索的文件名。 grep 命令会在指定的文件中搜索匹配模式的行,并将匹配到的行打印到标准输出。如果不指定文件名,则 grep 将会从标准输入读取数据进行搜索。...硬链接是文件系统中的一个指向原始文件 inode 的新路径,它们与原始文件在磁盘上的存储位置相同,因此对硬链接或原始文件的修改都会影响到另一个。...在使用 ln 命令时,如果不加任何选项,默认情况下会创建硬链接。要创建符号链接,需要使用 -s 选项。...off:与 none 相同。 numbered:创建带有数字后缀的备份文件。 t:将每次备份视为一个版本,并在备份文件名中追加时间戳。

    11110

    Linux常用命令12 - vi

    为了能够输入文本,您需要进入插入模式按下 i 键。 这种模式允许您以在常规文本编辑器中相同的方式插入和删除字符。左下角会提示一个 insert。 ?...要从任何其他模式回到正常模式,只需按 Esc 键。 打开文件 使用 vim 打开文件,后面跟着要编辑或创建的文件的名称: vim file.text 保存文件 在 vim 中保存文件的命令是:w。...要在不退出编辑器的情况下保存文件,请按 Esc 键切换回正常模式,输入:w 并按 Enter 键。...按键盘最左上角 Esc :w 按下 Enter 还有一个 update 命令:up,它只在文件中有未保存的更改时才将缓冲区写入文件。...要以不同的名称保存文件,输入:w new filename,然后按 Enter 键。 保存文件并退出 在 vim 中保存文件并退出编辑器的命令是:wq。

    2K30

    程序员必知必会的那些邪恶的脚本

    警告,切勿在生产环境体验,一切后果脚本作者和本文作者均不不承担任何法律责任! 警告,切勿在生产环境体验,一切后果脚本作者和本文作者均不不承担任何法律责任!...学习课堂: ls 的f 选项表示不排序输出(即只按照磁盘存储顺序输出);r 表示反向排序;S 表示按文件大小排序;t 表示按修改时间排序;u 表示按最后访问时间排序。 6....我默默地输入了 eject, 在同事愕然的眼光中不带走一丝云彩轻轻地离开。...当你输入了一个命令之后,用小指轻轻地、优雅地,按下右侧的那个小小的回车键,满心以为会爆发出绝世高手的风范。然而……并没有,非但没有,你输入的命令还被删除了一个字符!...,所触发的 ASCII 码是 0x7F,即“退格”。也就是说,你按下的回车键,会被映射为退格键。

    99070

    scrolllock键_scroll键作用

    中文名称:滚动锁定键   按下此键后在Excel等按上、下键滚动时,会锁定光标而滚动页面;如果放开此键,则按上、下键时会滚动光标而不滚动页面。 键盘上三个灯分别是什么??...该键在字母A的左边哦。也就是在shift键的上面。按住该键即可点亮第二个灯了。同时在输入字母的时候就是大写字母了。如果没有亮灯的话就是小写字母。 最三个灯有很多用户都不是很了解,一般用途都不怎么大。...它是在F12的右边的第二个键,如果该灯点亮就是开启了滚动键锁定的意思,按下此键后在Excel等按上、下键滚动时,会锁定光标而滚动页面。如果放开此键,则按上、下键时会滚动光标而不滚动页面。...经常有朋友在输入密码的时候,发现总是错的,有一些就是因为不小心把大写锁定键给打开了,这样输入的密码是大写的,而他自己却不知道。 3、Scroll Lock键 该键一般情况下都用不上。...键盘上的三个灯为什么会不亮 1、键盘与主机接口没有插好 如果键盘完全不管用,也无法打上字,指示灯也不亮,有可能是键盘与主机的接口没有插好,此时我们可以把键盘与主机的接口重新插一次,然后重启电脑。

    1.6K20

    JavaScript 的新数组分组方法

    你总是要检查对象是否存在分组键,如果不存在,就用一个空数组来创建它。然后再将项目推入数组。...不过也有一些需要注意的地方。 Object.groupBy 返回一个空原型对象。这意味着该对象不继承 Object.prototype 的任何属性。...请注意,要从该 Map 中按对象检索项目,对象必须具有相同的引用。...根据该提案,有一个库曾经用一个不兼容的 groupBy 方法对 Array.prototype 进行了猴子补丁。在考虑新的应用程序接口时,向后兼容性非常重要。...几年前,在尝试实现 Array.prototype.flatten 时,这一点在一次被称为 SmooshGate[1] 的事件中得到了强调。 幸运的是,使用静态方法似乎更有利于未来的可扩展性。

    31810

    如何在一场面试中展现你对Python的coding能力?

    另外,在编码面试设置中,你几乎不希望在整个代码中调用print()。 相反,你应该使用调试器。...在这种情况下,字典现在按年龄按升序排序。 有效利用数据结构 算法在面试中得到了很多关注,但数据结构可能更为重要。在coding面试环境中,选择正确的数据结构会对性能产生重大影响。...面试官几乎总是注意到(并询问)这种类型的设计选择。 更糟糕的做法 为避免从列表转换为集合,你现在可以在不使用任何其他数据结构的情况下将值存储在列表中。...如果你考虑.add()中发生了什么,它甚至听起来像第二种方法:得到单词,检查它是否已经在集合中,如果没有,则将其添加到数据结构中。 那么为什么使用与第二种方法不同的集合呢?...使用collections.defaultdict()处理缺少的字典键 当你为单个键设置默认值时,.get()和.setdefault()可以正常工作,但通常需要为所有可能的未设置键设置默认值,尤其是在面试环境中进行编程时

    1.2K30

    【汇编语言】第一个程序(三)—— 深度剖析汇编程序的执行流程:编辑、编译、连接与运行

    3.1 编译源程序 在执行文件的目录下,运行masm.exe。输入要编译的源程序文件名后,按Enter键,屏幕显示如下图所示。...上图中,编译程序提示输入列表文件的名称,这个文件是编译器将源程序编译为目标文件的过程中产生的中间结果。可以让编译器不生成这个文件,直接按Enter键即可。...可以让编译器不生成这个文件,直接按 Enter 键即可。 3.4 编译结束的结果 忽略了交叉引用文件的生成后,屏幕显示如下图所示。...上图中,连接程序提示输入映像文件的名称,这个文件是连接程序将目标文件连接为可执行文件过程中产生的中间结果,可以让连接程序不生成这个文件,直接按Enter键即可。...但是,这个程序中没有调用任何子程序,所以,这里忽略库文件名的输入,直接按Enter 键即可。 4.4 连接结束的结果 忽略了库文件的连接后,屏幕显示如下图所示。

    58110

    如何在一场面试中展现你对Python的coding能力?| 技术头条

    另外,在编码面试设置中,你几乎不希望在整个代码中调用print()。 相反,你应该使用调试器。...在这种情况下,字典现在按年龄按升序排序。 有效利用数据结构 算法在面试中得到了很多关注,但数据结构可能更为重要。在coding面试环境中,选择正确的数据结构会对性能产生重大影响。...面试官几乎总是注意到(并询问)这种类型的设计选择。 更糟糕的做法 为避免从列表转换为集合,你现在可以在不使用任何其他数据结构的情况下将值存储在列表中。...如果你考虑.add()中发生了什么,它甚至听起来像第二种方法:得到单词,检查它是否已经在集合中,如果没有,则将其添加到数据结构中。 那么为什么使用与第二种方法不同的集合呢?...使用collections.defaultdict()处理缺少的字典键 当你为单个键设置默认值时,.get()和.setdefault()可以正常工作,但通常需要为所有可能的未设置键设置默认值,尤其是在面试环境中进行编程时

    1.1K30

    流式系统:第五章到第八章

    为什么我们不直接从那里读取我们的结果呢?...在按键分组后,系统可以继续在该键内按窗口进行分组(使用分层复合键的子组件)。按窗口进行分组就是窗口合并发生的地方。...这只在无界情况下才相关吗?批处理管道使用持久状态吗,为什么或为什么不?...但是因为 SQL 的通用货币是表,它必须首先将投影流转换为表。并且因为用户没有指定任何显式的键来分组,它必须简单地按其标识(即附加语义,通常通过按每行的物理存储偏移量进行分组)分组键。...首先,让我们看一下没有撤销的管道。在清楚了为什么该管道对于将增量会话写入键/值存储的用例是有问题之后,我们将看一下带有撤销的版本。 不撤销管道的 Beam 代码看起来像示例 8-7。

    73810
    领券