为什么在C中使用\r和\b?
为什么在C中使用\r和\b?我知道\b会将“hello\b世界”变成“hellworld”。但是我们可以写“hellworld”而不是“hello\b世界”。那么,它在程序中的作用是什么呢?这个问题描述了\b要做什么,但没有说明使用它的原因。您使用它们来覆盖以前编写的内容。您通常不会在同一个字符串中使用它们,而是在不同的输出调用中使用,例如为什么在C中使用\r和\b?,c,C,为什么在C中使用\r和\b?我知道\b会将“hello\b世界”变成“hellworld”。但是我们可以写“hellworld”而不是“hello\b世界”。那么,它在程序中的作用是什么呢?这个问题描述了\b要做什么,但没有说明使用它的原因。您使用它们来覆盖以前编写的内容。您通常不会在同一个字符串中使用它们,而是在不同的输出调用中使用,例如 printf("hello"); fflush(stdout); // need to flush because we didn't
printf("hello");
fflush(stdout); // need to flush because we didn't write a newline
// do some stuff here
printf("\rgoodbye\n"); // This replaces hello
这在很大程度上只是历史原因。许多字符实际上可以追溯到模拟打字机!在过去,您的计算机使用矩阵打印机而不是显示器。在那些日子里,粗体字体是通过在同一位置打印两次来实现的 例如,在Linux中,我们使用字符
\n
作为新行,但在Windows中它是\r\n
,那么这些字符是什么?嗯,\n
(换行符)是将打字机的机头向下移动一行,\r
是回车符,它将打字机的回车符返回到行的开头
这些字符中的许多不再经常使用。它们大多被认为是遗产。它们在现代编程中并没有那么有用。您可以使用\b
返回并覆盖以前编写的内容,但今天您可以使用像ncurses这样的库来实现同样的功能。在过去,你实际上可以使用这些来获得相当精确的东西定位,但在现代终端模拟器上,情况就不再是这样了。例如,旧的终端具有固定的大小。这些大小可能尚未标准化,但它们在运行时没有改变,并且每次运行程序时,同一台机器的大小都相同
如果我想用某种进度条写一个CLI应用程序,我可以考虑使用<代码> \b/>代码> <代码> \r>代码>。例如:
#include <stdio.h>
#include <unistd.h>
int main(void) {
int n = 0;
while(n<=100) {
printf("\rProgress: %d\%", n);
fflush(stdout);
sleep(1);
n+=10;
}
}
几乎所有这些都被其他东西所取代。例如,通过更高级别的协议,如tcp等,也可以通过库,如ncurses。在C语言中,空字符对字符串很有用,但也可以用其他方法解决,比如当数组传递给函数时,可以检索数组的大小。这些转义序列现在主要用于创建某种CLI“GUI”,用于CLI“动画”,如显示“加载进度”还有一些特别的技巧 在过去,这些转义序列主要用于控制电传打字机和穿孔卡片 例如,要删除穿孔卡上最后一个穿孔字符,您可以使用:
putchar('\b');普查尔(127);/*DEL*/
\r
用于将光标移动到上一行的开头,而\n
用于将光标移动到下一行的开头
#include <stdio.h>
#include <unistd.h>
#include<iostream>
using namespace std;
int main() {
cout<<"Hello";
cout<<"\r";
cout<<"Gone ";
}
自己测试。\n“新线路
“\b对于退格,意味着如果您打印它,光标将打印并返回1个字符。例如你可能不会在一个字符串中使用它们,但是你可以用它们来覆盖你之前写的东西。这是一个例子。没有其他原因。在点阵或雏菊轮打印机的旧时代,您使用
\r
将打印头移回行首,然后再次写入相同的文本以获得粗体,或者您可以使用不同的文本,也可以获得不同强度的图像。使用\b
将允许您一次多拖动一个字符。使用\r\n
作为行尾仍然是许多internet协议(以及Windows上的行尾)的一部分。现在很少使用\b
——我不记得上次使用它是什么时候,但它可能比\a
或\v
更新。如果在与操作员交互时实现一个应用程序进行一些行编辑,这可以用来来回移动光标,删除字符等。\r
将所有内容都保留在缓存中,这样就不会影响性能。希望能有所帮助:)哇!最后我知道我可以用它做什么。非常感谢Dev Parzival。\b
在模拟某人编写文本并点击backspace时非常有用。这可能是人们在基于文本的游戏中为了讲故事或作为视觉噱头想要做的事情。
#include <stdio.h>
#include <unistd.h>
#include<iostream>
using namespace std;
int main() {
cout<<"Hello";
cout<<"\r";
cout<<"Gone ";
}
#include <stdio.h>
#include <unistd.h>
int main() {
int i=0;
int n=4;
char pattern[n];
pattern[0]=(char)179;
pattern[1]=(char)47;
pattern[2]=(char)196;
pattern[3]=(char)92;
long long int count=0;
while(count<100000000){
printf("%c",pattern[i]);
i=(i+1)%n;
printf("\r");
count++;
}
}