C++ &引用\b";作为字符添加到字符串中

C++ &引用\b";作为字符添加到字符串中,c++,C++,在下面的代码中,“\b”从字符串中删除一个字符,但它会增加其大小,就好像该字符可能在字符串中,但不可见一样 while (true) { c = _getch(); if (c=='\r') {break;} else if (c=='\b') { cout<<"\b"<<" "<<"\b"; s+="\b \b"; } else {cout<<"*"; s=s+c;} } while(true){ c=_getch(); 如果(c='\r')

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

while (true) {
c = _getch();
if (c=='\r') {break;} 
else if (c=='\b') { cout<<"\b"<<" "<<"\b"; s+="\b \b"; }
else {cout<<"*"; s=s+c;}
}
while(true){
c=_getch();
如果(c='\r'){break;}
否则,如果(c=='\b'){cout您需要在获得退格时“物理地”删除字符串中的最后一个字符:

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.length()
(或
s.size()
)保存到一个局部变量中,以避免额外的调用-假设编译器知道std::string,但还没有执行该操作)。

当获得退格时,需要“物理”删除字符串中的最后一个字符:

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.length()
(或
s.size()
)保存到一个局部变量中,以避免额外的调用-假设编译器知道std::string,但还没有这样做)。

如果您正在将一个字符一个字符读取到一个字符串中,您可以执行以下操作:

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;

    }    
}
std::string mystr;
while(true){
c=_getch();
如果(c='\r'){break;}
如果(c=='\b')
{
//这将从字符串中删除最后一个字符
如果(mystr.size()>0)
{

cout如果要将一个字符一个字符地读入字符串,可以执行以下操作:

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;

    }    
}
std::string mystr;
while(true){
c=_getch();
如果(c='\r'){break;}
如果(c=='\b')
{
//这将从字符串中删除最后一个字符
如果(mystr.size()>0)
{


coutBackspace字符仍然是一个字符。这正是应该发生的。遇到退格时,您需要删除s的最后一个字符;没有其他方法。@Nemanjabric,这是绝对正确的,但我如何才能完全摆脱它?@Iserni,我已经编辑了我的问题。但问题中的字符串在哪里?退格字符仍然是一个字符。这正是应该发生的。遇到退格时,您需要删除s的最后一个字符;没有其他方法。@Nemanjabric,这是绝对正确的,但我如何才能完全删除它?@Iserni,我已编辑了我的问题。但问题中的字符串在哪里?我宁愿执行s.erase(s.end()-1)或者s.resize(s.size()-1),而不是使用子字符串来避免额外的复制的确,你是对的。但另一方面,这个周期是用户限制的。键盘上的键不太可能以超过每10毫秒一个的速度通过(“点击并按住退格键”)。不过我会更新答案。非常感谢,我不知道我必须-1字符串的长度。我宁愿执行s.erase(s.end()-1)或s.resize(s.size()-1)事实上,您没有使用子字符串来避免额外的复制。但另一方面,此循环受用户限制很大。键盘上的键不太可能每10毫秒通过一个以上(“点击并按住退格键”)。不过我会更新答案。非常感谢,我不知道我必须-1字符串的长度…为什么没有人投票给这个答案?:-?显然,他们想让我赢得无名英雄徽章:)。可能是这样吗
是一个特定于平台或编译器的函数,您还没有告诉我们它与哪个平台或编译器一起使用?@ThomasMatthews,因为OP自己将
*
回显到stdout,我猜,他正在使用以下实现:
函数从控制台读取单个字符,而不回显字符r
…为什么没有人对这个答案投赞成票?:-?显然,他们想让我赢得无名英雄徽章:)。会是这样吗
是一个特定于平台或编译器的函数,您还没有告诉我们它与哪个平台或编译器一起使用?@ThomasMatthews,因为OP自己将
*
回显到stdout,我猜,他正在使用以下实现:
函数从控制台读取单个字符,而不回显字符r