String s = "aaaaaaa\r"; System.out.println(s +"=");
设想会打印: aaaaaaa '='
实际打印的是: '='
有人知道为啥吗
打印的是没有单引号的,不知道为啥,直接写等号不能显示
猜想: 是因为字符串 s 中含有\r 自动回车了,但是没有换行。所以光标还是在当前行 打印=时是在本行开头位置打印,最后才是 newline 如有不对请指教
1
monkeyWie 2021-11-01 11:44:41 +08:00
你猜的没毛病,\r 就是用来清空终端一行内容的
|
2
Vegetable 2021-11-01 11:51:45 +08:00
实际打印的应该是=aaaaaa 吧?
因为 /r 是回到行首,又打印了=,第一个 a 被=覆盖了。 这个打印方式最常见的就是原地输出进度。 for (int i = 0; i < 100; i++) { TimeUnit.SECONDS.sleep(1); System.out.print(String.format("\r%d%%", i)); } @monkeyWie 说的不准确,/r 并不会清空内容,只会移动 cursor ,我不确定为什么你后边的 a 没了,没道理啊,是因为 windows 吗? |
3
AoEiuV020 2021-11-01 12:20:51 +08:00
这种问题和终端有关,和代码无关,就看终端是否支持\r 回车,
|
4
vanishxiaoma OP @Vegetable 是 windows 的
|
5
bonjourcs 2021-11-01 17:21:38 +08:00
\r 是回车符( carriage return ,参考打字机的回车)。在终端显示的时候,回车会将光标移到行首。所以你调用 Java 的 println 方法时, 「 aaaaaaa 」 会先被一个光标覆盖,然后再显示「=」。也就是 @monkeyWie 表达的「清空终端一行内容」。但是这种「清空」只是视觉上的,本质上这个字符串的长度还是 「 aaaaaaa=」的长度。
|
6
chengyiqun 2021-11-01 22:47:12 +08:00
https://tupian.li/images/2021/11/01/image5cbe907ec9f638db.png
我这儿是正常的, 说下你系统版本, 和 jdk 版本, oracle 的还是 open 的, open 的是哪家的, 说不定是 bug. |
7
vanishxiaoma OP @chengyiqun 系统 win10 oracle jdk 1.8
|
8
chengyiqun 2021-11-02 09:09:13 +08:00
|
9
bonjourcs 2021-11-02 09:58:14 +08:00
是我理解错了,回车符号是将光标移至行首,然后执行替换插入后续字符串。 @chengyiqun 正解。
回车符会覆盖之前的内容是 IntelliJ IDEA 上会出现的 "bug",这个 bug 在 Eclipse 里也出现过。相关链接:IntejjiJ : https://youtrack.jetbrains.com/issue/PY-33627?_ga=2.109889036.880141845.1635816502-1211060100.1635411421 Eclipse: https://bugs.eclipse.org/bugs/show_bug.cgi?id=76936 |
10
chengyiqun 2021-11-02 11:35:49 +08:00
@bonjourcs 原来如此, 我从来没在 idea 里写过类似的代码, 所以不知道这个. 这个怎么解决呢? idea 2021.2.3
|
11
chengyiqun 2021-11-02 11:36:26 +08:00
@bonjourcs 就是说是 idea 运行的终端自己的行为问题导致的了?
|
12
bonjourcs 2021-11-02 13:34:51 +08:00
@chengyiqun 我测试的情况看来是 IDEA 的问题。社区里并没有说怎么解决,PyCharm 倒是可以通过更改运行的 Emulate terminal in output console 解决,IDEA 这个问题现在还挂着呢。
|