我尝试使用以下功能获取文件名,同时允许“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;
}
答案 0 :(得分:3)
在此处阅读运算符优先级:http://en.cppreference.com/w/cpp/language/operator_precedence
其中一个问题在于
行while (ch = _getch() != 'CR')
因为!=
的优先级高于赋值运算符
你实际要问的是:
while( ch = (_getch() != 'CR') )
因此得到表达式的结果而不是你想要的字符(这是标准§4.7/ 4中定义的整数转换 bool->; char为0或1)
此外:您将返回对局部变量的引用。确保返回按值复制或不属于超出范围的内容。
最后:_getch()
返回从控制台读取的字符,您不能“拦截”特殊键和弦(例如Ctrl-D或Esc)。在此处阅读更多内容:http://msdn.microsoft.com/it-it/library/078sfkak.aspx