c - 在 C 中将模板字符串中的\b 处理为 printf

标签 c terminal escaping printf

谁能解释一下或给我指出一个引用资料,解释为什么在第一行打印的代码片段中包含整个单词 hello,而在第二行中它只包含字母?我认为无论换行转义如何,退格转义字符都会删除最后三个字母。我已阅读有关 printf 的 GNU 文档,但找不到任何要点。

int main(void)
{
    printf("hello\b\b\b\n");        
    return 0;
}



int main(void)
{
    printf("hello\b\b\b");
    return 0;
}

最佳答案

这实际上不是关于 C 或 printf 的问题。在每种情况下,代码都完全按照它所说的去做:在第一个示例中,它输出 9 个字符 h e l l o\b\b\b\n,在第二个示例中,它同样输出 8 个字符。如果您将标准输出写入一个文件,那么该文件将包含什么内容。但是如果你写到一个终端,你的终端可能会通过退格处理 \b ,所以你的问题实际上是关于你的终端的。你还没有说你使用的是什么终端。

退格字符的一种常见行为方式是将光标向左移动一个位置,但实际上并不删除该位置的字符。下一个字符输出将覆盖它。

在您的第一个示例中,您将光标移回第一个 l,但是您永远不会在它或任何其他字符上写任何东西。然后 \n 不会改变屏幕上的任何字符,只是将光标移动到下一行。所以您仍然会在前一行看到 hello

在您的第二个示例中,当您的程序终止时,光标留在第一个 l 上。所以下一个将输出写入终端的程序将覆盖该字符(除非下一个程序的第一个写入是 \n 或类似的东西)。下一个程序可能是您的 shell,因此您的 shell 提示符中的字符可能会覆盖 llo,因此您看不到它们。

关于c - 在 C 中将模板字符串中的\b 处理为 printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44875513/

相关文章:

c - Windows API的CreateFile()中OPEN_ALWAYS和CREATE_ALWAYS的区别

c - 查找出租车号码

C 使用指针调用函数时出现问题

macos - 在没有终端的情况下在 osx 上启动 node.js

c - C语言如何退出控制台屏幕

linux - OSX sed : how to use the escape character in the second field of a `s` operation?

jsp - 由于在jsp文件中使用双引号引起的简单错误

C++ Mysql Real Escape 字符串问题

regex - 在 Gherkin/Cucumber 中转义注释 (#) 的官方方法是什么?

bash - 行前的美元符号代表什么?