在下面的代码中,“\ b”从字符串中删除了一个字符,但它增加了它的大小,好像char可能在其中但不可见。
while (true) {
c = _getch();
if (c=='\r') {break;}
else if (c=='\b') { cout<<"\b"<<" "<<"\b"; s+="\b \b"; }
else {cout<<"*"; s=s+c;}
}
例如,该字符串的大小(abc“\ b”d),“c被删除并替换为d”,仍然是5。
我想知道在这种情况下如何有效地处理退格。
答案 0 :(得分:2)
当您获得退格时,您需要“物理地”删除字符串中的最后一个字符:
while (true) {
c = _getch();
if (c=='\r') {
break;
}
if (c=='\b') {
cout<<"\b"<<" "<<"\b";
if (s.length() > 0) {
s = s.substring(0, s.length()-1);
}
}
else {cout<<"*"; s=s+c;}
}
作为优化,我们可以按照Jason的建议修剪s
而不是重新分配:
s.resize(s.size() -1);
(虽然我们正在使用它,我们可以将s.length()
(或s.size()
)保存到局部变量中以避免额外的调用 - 假设编译器知道std :: string,那么'已经这样做了。)
答案 1 :(得分:2)
如果您逐字逐句地阅读字符串,您可以执行以下操作:
std::string mystr;
while (true) {
c = _getch();
if (c=='\r') {break;}
if(c == '\b')
{
// This will remove last character from your string
if(mystr.size () > 0)
{
cout<<"\b"<<" "<<"\b";
mystr.resize (mystr.size () - 1);
// or mystr.pop_back() in C++11
}
}
else
{
cout<<"*";
mystr += c;
}
}
答案 2 :(得分:0)
for(char c=_getch(); c!='\r'; c=_getch())
if(c=='\b')
mystr.pop_back();
else
mystr.push_back(c);