【问题标题】:getchar function working differently after Ubuntu 19.04 update?Ubuntu 19.04 更新后 getchar 函数的工作方式不同?
【发布时间】:2026-01-26 23:50:01
【问题描述】:

我正在编写一个同时使用 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(),因此当我在我的程序集文件中执行call getchar 时,我实际上可以接收来自用户的输入。但是,在更新 Ubuntu 后,我的程序仅在数字正确且未读入 ’y/n‘ 时才输出问题。

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

为了进一步说明,我正在终端中使用 g++ 进行编译/链接,并使用 nasm 进行组装。如果需要,我可以提供更多代码。在组装中,我只是在做:

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

【问题讨论】:

    标签: nasm ubuntu-19.04


    【解决方案1】:

    我找到了解决办法。

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

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

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

    【讨论】: