【问题标题】:getch returns 2 characters when I type one当我输入一个字符时,getch 返回 2 个字符
【发布时间】:2019-01-18 09:56:28
【问题描述】:

当我使用 getch 时,它总是在读取的字符后面附加一个空字符。

当我使用以下代码时:

#include "stdafx.h"
#include <conio.h>

int main()
{
    char c = 0;

    while (c != 'x')
    {
        c = _getch();
        printf("Char read: <%c> \n", c);
    }
}

当我按下“asdx”键时,它会在控制台上返回以下内容:

Char read: <a>
Char read: < >
Char read: <s>
Char read: < >
Char read: <d>
Char read: < >
Char read: <x>

这是在 VS 2017 中编译的一个普通的新单文件项目,在 Windows 10 控制台窗口上运行。我尝试删除 _UNICODE 和 UNICODE 定义。

【问题讨论】:

  • 你怎么知道它是一个空字符?顺便说一句,_getch() 返回int
  • 按预期工作,您是否尝试打印 c 的数值以查看它是什么?
  • 我知道它是一个空值,因为我将它追踪到调试器中。我尝试使用 int 或 char,得到了相同的结果。
  • 这显然是某些版本的 Windows SDK 的问题,请参阅developercommunity.visualstudio.com/content/problem/247770/…
  • @AlanBirtles:它在调试模式下对我有用,但在发布模式下失败。与 OP 的行为相同。

标签: c++ visual-studio-2017 console-application


【解决方案1】:

好吧,废话!

这是 Windows 中的一个(相当新的)错误。

https://developercommunity.visualstudio.com/content/problem/247770/-getch-broken-in-vs-157.html

"使用 _getch() 函数构建控制台应用程序时 每次按键突然返回两次”

从微软得到以下回复:

" 感谢您报告此问题!这将在以后的窗口中修复 更新。”

更新: 如上面的链接所述,将运行时设置为 静态链接C 运行时的先前版本 将解决问题,但您需要确保所有相关项目(例如,如果您正在构建库)也使用相同的运行时。 (我测试过)

【讨论】:

    【解决方案2】:

    如果您不想(或不能)使用以前版本的通用 C 运行时,您可以使用 _getwch 而不是 _getch,因为该问题不会影响到 _getwch功能。

    请注意,_getwch 可以返回 Unicode 字符,因此对于某些键,它可能返回与 _getch 不同的值。例如,对于 字符,_getch 返回 0x3f (?) 而 _getwch 返回 0x20ac(欧元的 Unicode 值)

    【讨论】:

      猜你喜欢
      • 2021-01-25
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多