Ubuntu 19.04 更新后 getchar 函数的工作方式不同?

getchar function working differently after Ubuntu 19.04 update?

我正在使用 Assembly 和 C++ 编写一个程序来收集用户输入的数据。在我的 C++ 文件中,我使用 cin 循环读取用户编号:

    while (cin >> input)
    {
       myArray.push_back(input);
    }

    cin.clear();

用户还被告知在完成后键入 CTRL-D。在我链接的程序集文件中,我询问用户 Are these numbers correct (y/n)?

以前在更新到 Ubuntu 19.04 之前,我会在阅读输入后执行 cin.clear(),所以当我在我的 Assembly 文件中执行 call getchar 时,我实际上可以接收来自用户的输入。但是,在更新 Ubuntu 之后,我的程序只输出数字是否正确的问题,而没有读入 ’y/n‘.

在我的 cin 循环之后我也尝试了 cin.ignore() 但这似乎并没有解决我的问题。我只能假设我的 Assembly 文件中的 call getchar 正在读取一些换行符而不是接受用户输入,但无论我在网上找到的修复程序如何,似乎都无法接受它。

为了进一步说明,我 compiling/linking 在我的终端中使用 g++ 并使用 nasm 进行汇编。如果需要,我可以提供更多代码。在 Assembly 中,我只是在做:

    mov rax, 0
    mov rdi, correctnumbersprompt ;This holds the string asking y/n
    call printf
    call getchar

我找到了解决方法。

为了正确清除流状态,我必须使用 cin.clear(); 从我的 C++ 文件中以及在我的程序集文件中清除它,我通过执行以下操作清除了流:

extern stdin
extern clearerr

mov rax, 0
mov rdi, [stdin]
call clearerr

这样我就可以在使用 CTRL+D 结束输入流后成功执行 call getchar 来获取用户输入。