0

在下面的代码中,“\b”从字符串中删除了一个字符,但它增加了它的大小,就好像字符可以在其中但不可见一样。

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。

我想知道在这种情况下如何有效地处理退格键。

4

3 回答 3

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;}
}

作为优化,我们可以修剪s而不是重新分配,正如 Jason 所建议的:

    s.resize(s.size() -1);

(当我们这样做时,我们可以将s.length()(或s.size())保存到局部变量中以避免额外的调用 - 假设编译器知道 std::string 并没有这样做)。

于 2013-09-12T21:08:39.190 回答
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;

    }    
}
于 2013-09-12T21:09:31.583 回答
0
for(char c=_getch(); c!='\r'; c=_getch())
  if(c=='\b')
    mystr.pop_back();
  else
    mystr.push_back(c);
于 2013-09-12T21:48:19.507 回答