我正在尝试使用退格控制字符'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";