0

我正在尝试下面的函数来获取文件名,同时允许按“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;
}
4

1 回答 1

3

在此处阅读运算符优先级:http: //en.cppreference.com/w/cpp/language/operator_precedence

问题之一是在线

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

因为!=具有比赋值运算符更高的优先级

您实际上要问的是:

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

从而得到表达式的结果而不是你想要的字符(这是标准§4.7/4中定义为0或1的整数转换bool->char)

此外:您正在返回对局部变量的引用。确保返回按值复制或不超出范围的内容。

最后:_getch()返回从控制台读取的字符,您不能“拦截”特殊键和弦(例如 Ctrl-D 或 Esc)。在此处阅读更多信息:http: //msdn.microsoft.com/it-it/library/078sfkak.aspx

于 2014-07-30T13:38:12.663 回答