C - puts() 与 printf() 使用 \b
C - puts() vs. printf() using \b
printf("backspace\b");
输出:backspac
puts("backspace\b");
输出:退格
这是为什么?因为 puts()
添加了一个终止换行符并且 \b
因此没有效果?
看起来它们都将光标向后移动了一个位置,但是 puts() 在单词的末尾附加了一个换行符,因此如果您尝试覆盖当前光标,您实际上并没有擦除 'e', 因为光标已经落到下一行了
正如评论中有人所说,代码示例会给出更准确和正确的答案。
编辑:从评论来看,似乎将光标向后移动然后打印字符会覆盖单词,除非该字符是换行符,否则不会。
printf("backspace\b\n "); // Output: backspace
printf("backspace\b"); // Output: backspac|e (| for cursor)
printf("backspace\b "); // Output: backspac
printf("backspace\b");
在典型的终端或模拟器上,这将打印字符串 backspace
,然后将光标移回一个位置,将其留在最后的 e
之上。如果您看到 backspac
,那是因为在 printf
调用之后有其他东西破坏了 e
,要么是因为同一个程序打印了更多输出(您没有向我们展示),要么是因为程序完成后发生了一些事情。如果 printf
是你程序中唯一的语句,而你 运行 在类 Unix shell 中运行,那么 shell 提示符可能会破坏 e
.
puts("backspace\b");
puts
函数将换行符 '\n'
添加到其输出。这相当于
printf("backspace\b\n");
与前面的示例一样,\b
会使光标向后移动一个位置,在 e
的顶部,但随后 \n'
会使其移动到下一行的开头,不会破坏 e
.
在这两种情况下,退格字符 '\b'
都会写入标准输出。如果您 运行 您的程序将输出重定向到一个文件,然后检查该文件,您会看到它,可能显示为十六进制的 ^H
或 08
,具体取决于您的查看方式它。
printf("backspace\b");
输出:backspac
puts("backspace\b");
输出:退格
这是为什么?因为 puts()
添加了一个终止换行符并且 \b
因此没有效果?
看起来它们都将光标向后移动了一个位置,但是 puts() 在单词的末尾附加了一个换行符,因此如果您尝试覆盖当前光标,您实际上并没有擦除 'e', 因为光标已经落到下一行了
正如评论中有人所说,代码示例会给出更准确和正确的答案。
编辑:从评论来看,似乎将光标向后移动然后打印字符会覆盖单词,除非该字符是换行符,否则不会。
printf("backspace\b\n "); // Output: backspace
printf("backspace\b"); // Output: backspac|e (| for cursor)
printf("backspace\b "); // Output: backspac
printf("backspace\b");
在典型的终端或模拟器上,这将打印字符串 backspace
,然后将光标移回一个位置,将其留在最后的 e
之上。如果您看到 backspac
,那是因为在 printf
调用之后有其他东西破坏了 e
,要么是因为同一个程序打印了更多输出(您没有向我们展示),要么是因为程序完成后发生了一些事情。如果 printf
是你程序中唯一的语句,而你 运行 在类 Unix shell 中运行,那么 shell 提示符可能会破坏 e
.
puts("backspace\b");
puts
函数将换行符 '\n'
添加到其输出。这相当于
printf("backspace\b\n");
与前面的示例一样,\b
会使光标向后移动一个位置,在 e
的顶部,但随后 \n'
会使其移动到下一行的开头,不会破坏 e
.
在这两种情况下,退格字符 '\b'
都会写入标准输出。如果您 运行 您的程序将输出重定向到一个文件,然后检查该文件,您会看到它,可能显示为十六进制的 ^H
或 08
,具体取决于您的查看方式它。