Функция getchar работает по-другому после обновления Ubuntu 19.04?

Я пишу программу, использующую сборку и С++ для сбора данных, вводимых пользователем. В моем файле С++ я читаю номера пользователей с помощью цикла 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.ignore() после цикла cin, но, похоже, это не решило мою проблему. Я могу только предположить, что call getchar в моем файле сборки читает какой-то символ новой строки, а не принимает пользовательский ввод, но независимо от того, какие исправления я нашел в Интернете, похоже, ничто не принимает его.

Для дальнейшего уточнения я компилирую/связываюсь с g++ в своем терминале и собираю с помощью nasm. Я могу предоставить дополнительный код, если это необходимо. В сборке я просто делаю:

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

person lawgik    schedule 19.10.2019    source источник


Ответы (1)


Я нашел исправление.

Чтобы правильно очистить состояние потока, мне пришлось очистить его как из моего файла C++ с помощью cin.clear();, так и из моего файла сборки, я очистил поток, выполнив:

extern stdin
extern clearerr

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

Это сделало так, что я мог успешно выполнить call getchar для захвата пользовательского ввода после использования CTRL+D для завершения входного потока.

person lawgik    schedule 22.10.2019