使用getch()函数实现BackSpace

时间:2017-11-18 20:43:32

标签: c++

我想问一下从字符串中插入和删除字符的问题。 这是代码:

void Edit::input() {
    int len = 0;
    COORD cord;
    cord.X = _x;
    cord.Y = _y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cord);
    while (true) {
        char ch = _getch();

        if (ch == 13)
        {
            break;
        }

        else if (ch == 8) 
        {   
            if (len == 0)
            {
                continue;
            }
            pusty.pop_back();
            std::cout << "\b  \b";
            len--;
        }
        else if (len == 6) {
            break;
        }
        else {
            pusty.push_back(ch);
            len++;
        }
        std::cout << ch;
    }
}

究竟是什么问题?我有窗口的X和Y的坐标,在这个窗口中输入文本,整个字符串的长度是6个字符。当len值位于最后一个元素时,我想要使用退格键时,问题出现了。然后退格在第7个索引上创建空格。下图显示了该问题。如何避免这个问题?感谢所有反馈。

enter image description here

1 个答案:

答案 0 :(得分:0)

额外的空间是由于使用getch,它回显到控制台以及将角色返回给你。这意味着达到了控制台输出的第7个位置,因此背景被绘制。

您只需要在打印\b \b之前将背景颜色设置为黑色(与您在示例中将其设置为绿松石的方式类似),然后将其设置回绿松石 - 这样就可以了隐藏你的幻影额外角色。

而不是使用getch,你应该考虑学习ncurses - 它提供了非常有用的功能,可以在这种情况下让生活变得更轻松(比如getch相当于没有回声)。它是跨平台的,因此您可以在Windows上使用它。