20

我正在尝试使用退格控制字符'\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 之后有一个结束行。我该怎么做?

4

4 回答 4

32

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

当然,您总是可以避免首先输出逗号:

if(i > 0) cout << ",";
cout << a[i];
于 2012-10-07T01:18:09.977 回答
5

或者,如果您喜欢 C+11 hack:

adjacent_difference(a.begin(), a.end(), ostream_iterator<int>(std::cout),
  [](int x, int)->int { return std::cout << ",", x; });
于 2012-10-07T04:53:42.377 回答
2

使用退格转义序列会导致小问题。如果你想打印你的数组并且你已经预先定义了它 - 它的大小总是非零。现在假设你不知道你的数组、集合、列表或任何你想打印的东西的大小,它可能是零。如果你已经打印了某事。在打印你的东西之前,你应该打印零元素,你的退格键会吞噬已经打印的东西。

假设您获得了指向内存位置和要打印和使用的元素数量的指针...:

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。下一个 你永远不知道你可能会删除什么。

工作示例

于 2019-03-01T12:06:13.877 回答
-1

是的, \b 只会移动诅咒,所以当你结束该行时,它只会将其移回该行的末尾。所以要实际擦除最后一部分,在 \b 之后有一个空格来实际擦除最后一个逗号。例如:cout<<"\b";

于 2017-10-15T19:37:17.260 回答