题
我正在尝试下面的函数来获取文件名,同时允许'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
不隶属于 StackOverflow