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

Я пишу программу с использованием ассемблера и c ++ для сбора данных, введенных пользователем. В моем файле c ++ я читаю пользовательские номера с циклом cin:

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

    cin.clear();

Пользователю также говорят набрать CTRL-D после завершения. В моем связанном файле Assembly я спрашиваю пользователя Are these numbers correct (y/n)?

Ранее, перед обновлением до Ubuntu 19.04, я сделал бы cin.clear(), как отмечено выше, после прочтения входных данных, поэтому, когда я выполнил call getchar обратно в свою сборкуфайл, я мог бы получить вход от пользователя. Однако после обновления Ubuntu моя программа выводит вопрос только о том, правильны ли числа и не читается в ’y/n‘.

Я также пытался cin.ignore() после цикла cin, но, похоже, это не такисправить мою проблему. Я могу только предположить, что call getchar в моем файле Assembly читает какой-то символ новой строки, а не вводит пользовательский ввод, но, независимо от исправлений, которые я нашел в Интернете, кажется, ничто не принимает его.

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

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

1 Ответ

0 голосов
/ 22 октября 2019

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

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

extern stdin
extern clearerr

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

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

...