Вопрос

Я пытаюсь использовать функцию ниже, чтобы получить имя файла, позволяя нажать «ESC» для возврата

но по какой-то причине _getch() всегда возвращает [1 '\x1'] и то, что печатается, является улыбающееся лицо, даже для BackSpace (что хорошо и все такое, но совершенно не то, чего я хочу).

  • Что тут происходит?

Другие идеи о том, как улучшить код, более чем приветствуются!(Я недавно закончил первый год обучения в колледже, поэтому я все еще новичок в программировании)

string& Get_Filename()
{
    char ch;
    string name;

    while (ch = _getch() != 'CR')
    {
        if (ch == 'ESC')
            throw RESTART;
        if (ch == 'BS')
        {
            name.pop_back();
            cout << 'BS';   // Also, will this correctly delete or will I need to
        }                   // << '\b' << ' ' << '\b'?
        else
        {
            name += ch;
            cout << ch;
        }
    }
    return name;
}
Это было полезно?

Решение

О приоритете операторов читайте здесь: http://en.cppreference.com/w/cpp/language/operator_precedence

Одна из проблем в строке

while (ch = _getch() != 'CR')

с != имеет более высокий приоритет, чем оператор присваивания

на самом деле вы спрашиваете:

while( ch = (_getch() != 'CR') )

и таким образом получить результат выражения вместо нужного символа (который является интегральное преобразование bool->char, определенный в стандарте §4.7/4 как 0 или 1)

Более того:вы возвращаете ссылку на локальную переменную.Обязательно верните копию по значению или что-то, что не выходит за рамки.

Окончательно: _getch() возвращает символ, прочитанный из консоли, вы не можете «перехватить» специальные сочетания клавиш (например,Ctrl-D или Esc).Подробнее читайте здесь: http://msdn.microsoft.com/it-it/library/078sfkak.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top