使用退格控制字符擦除



我正在尝试使用退格控制字符'b'来删除行末尾的尾随逗号。尽管它在没有其他输出到stdout的情况下工作,但在'b'之后有其他输出的情况下,它将变得无用。这里有一个例子:

#include <iostream>
using namespace std;
int main()
{
int a[] =  { 1, 3, 4, 5, 6, 32, 321, 9};
for ( int i = 0; i < 8; i++) {
cout << a[i] << "," ;
}
cout << "b" ;
//cout << endl;
return 0;
}

在上面的代码块中,如果行被注释为可见,我们将得到所需的结果,数字9后面没有逗号。但是,如果取消注释该行,则会重新显示逗号。

在我的程序中,我不希望逗号在那里,但希望在9之后有一个结束线。我该怎么做?

擦除控制台上最后一个字符的常用方法是使用序列"b b"。这会将光标向后移动一个空格,然后写入一个空格以擦除字符,并再次后退一步,以便新的写入从旧位置开始。请注意,b本身仅移动光标。

当然,您可以始终避免首先输出逗号:

if(i > 0) cout << ",";
cout << a[i];

或者,如果你喜欢C+11技巧:

adjacent_difference(a.begin(), a.end(), ostream_iterator<int>(std::cout),
[](int x, int)->int { return std::cout << ",", x; });

使用退格转义序列会导致小问题。如果你想打印你的数组,并且你已经预先定义了它,那么它的大小总是非零。现在想象一下,你们不知道数组、集合、列表或任何你们想要打印的东西的大小,它可能是零。如果你在打印东西之前已经打印了一些东西,并且你应该打印零个元素,那么你的退格将吞噬已经打印的东西。

假设您得到了指向内存位置和元素数量的指针,以便打印和使用…:

void printA(int *p, int count)
{
std::cout << "elements = [";
for (int i = 0; i < count; i++)
{
std::cout << p[i] << ",";
}
std::cout << "b]n";
}

要打印:

int tab[] = { 1, 2, 3, 4, 5, 6 };
printA(tab, 4);
printA(tab, 0); // <-- a problem

你最终得到:

elements = [1,2,3,4]
elements = ]

在这种特殊情况下,你的左括号被"吃掉"了。最好不要在元素后打印逗号并删除最后一个,因为循环可能执行零次,并且没有逗号可删除。相反,在每个元素之前打印逗号-是-但跳过第一次循环迭代-如下所示:

void printB(int *p, int count)
{
std::cout << "elements = [";
for (int i = 0; i < count; i++)
{
if (i != 0) std::cout << ',';
std::cout << p[i];
}
std::cout << "]n";
}

现在这个代码:

printB(tab, 4);
printB(tab, 0);

生成以下内容:

elements = [1,2,3,4]
elements = []

使用退格esc。seq。你永远不知道你可能会删除什么。

工作示例

是的,\b只会移动诅咒,所以当你结束这行时,它只会将其移回这行的末尾。所以要真正擦除最后一部分,在\b后面留一个空格,以便真正擦除最后的逗号。示例:cout<lt;"\b";

最新更新