gpt4 book ai didi

java -\b 不清除特定实例中的最后一个字符

转载 作者:行者123 更新时间:2023-12-01 09:45:13 25 4
gpt4 key购买 nike

class progReport extends Thread {

// function for clearing the line by printing escape char '\b'
private static void cls(){
for (int i = 0; i <50; i++) {
System.out.print("\b");
}
} //End of cls

//Running a thread for printing the message every 100 ms.
public void run(int prog) {
int k;
cls();

try {
Thread.sleep(100);
} catch(InterruptedException e) {
e.printStackTrace();
}

System.out.print("Scanning: " + (prog) + "% ");
k=prog%3; // mod 3, so as to decide which symbol to be used for revolving animation

switch (k) {
case 0:
System.out.print("/");
break;
case 1:
System.out.print("--"); // LINE WITH THE PROBLEM
break;
default:
System.out.print("\\");
break;
} // End of switch
} // End of run
} // end of class progReport

// class with main
public class ProgressDemo {
public static void main(String...a) {
int prog = 0;
progReport pr = new progReport();

while(prog <= 100)
pr.run(prog++);

System.out.println("\nScanning Complete!!");
} // End of main
} // End of class ProgressDemo

在命令行上执行此代码时,它不会清除情况 1 的最后一个“-”:其中两个破折号打印为“--”,但如果我在其他情况下包含一个空格(即,将“/”和“\\”更改为“/”和“\\”),然后它会正确清除整行。有人可以帮我指出为什么它的行为如此奇怪吗?

最佳答案

嗯。这是一个有趣的问题。您遇到的问题是退格字符就是这样。一个人物。如何处理这个字符取决于打印它的终端。

因此,在我的例子中,我使用的是 OS X 终端,该程序仅采用退格字符并将光标向后移动一个位置。然后,如果有后续字符,则删除这些字符。

所以当你打印时:

System.out.println("Hello\b");

什么也没发生。因为没有后续角色。另一方面,当您打印时:

System.out.println("Hello\b ");

然后它删除“o”字符,因为有一个后续字符(空格)。我知道这很奇怪,但事实就是这样。

现在,在您的程序中,您基本上将 50 个退格字符打印到输出流中,然后打印您的消息。然后再次按 50 退格键。然后又一条消息。然后再次按 50 退格键。然后是你的第三条消息,依此类推。

您的消息长度是:

*1 N

*2 N+1

*3 N

在第二种情况下,消息的长度比另一个字符长一个字符,因此即使您打印 N+1 个字符,也只有 N 个退格字符会处于 Activity 状态,因为退格字符将查看您的最后一条消息而不是最后一条消息。后续消息。

将这两件事放在一起(查看代码的后面,终端移动光标但不删除它),您将体验到您所经历的。

一种解决方案是您只需在 cls 函数的开头附加一个空格,如下所示:

// function for clearing the line by printing escape char '\b'
private static void cls(){
System.out.print(" ");
for (int i = 0; i < 50; i++) {
System.out.print("\b");
}
} //End of cls

这将确保即使您的消息只有 N 长,它也会激活 N+1 个退格键。

无论如何,你的程序根本就没有在新线程中运行。您还应该学习多线程,以了解如何正确启动和使用线程。

首先,当您扩展 Thread 类时,您应该运行 start() 方法来激活它。否则你的代码只是在主线程上运行。

关于java -\b 不清除特定实例中的最后一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38107139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com