“\ b”作为字符添加到字符串中

时间:2013-09-12 21:03:36

标签: c++

在下面的代码中,“\ 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。

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

3 个答案:

答案 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);