C 为什么\r";删除我以前打印的行,但“删除”\r";它没有';T

C 为什么\r";删除我以前打印的行,但“删除”\r";它没有';T,c,printf,carriage-return,C,Printf,Carriage Return,当我打印某一行时,如果我想覆盖例如第一个字符,我会使用\r,因为这是回车字符,但它只在这一个字符之后打印一个字符,我的整行都会被覆盖 这是我为这个问题编写的一些代码 #include <stdio.h> int main(){ printf("-------"); printf("\r "); return 0; } 使用第二个代码,我的输出是“----”(不带引号) 我的预期输出:“----” 为什么不起作用?\r是回车。它将“回车”(现代的光标)发

当我打印某一行时,如果我想覆盖例如第一个字符,我会使用
\r
,因为这是回车字符,但它只在这一个字符之后打印一个字符,我的整行都会被覆盖

这是我为这个问题编写的一些代码

#include <stdio.h>

int main(){

    printf("-------");
    printf("\r ");
    return 0;

}
使用第二个代码,我的输出是
“----”
(不带引号)

我的预期输出:
“----”


为什么不起作用?

\r
是回车。它将“回车”(现代的光标)发送回同一行的开头。它本身不会擦除任何内容,只是移动光标。显然,您的终端具有这样的行为:在行首打印字符会擦除行的其余部分。我想这还不能保证


在许多系统上,如果要清除当前行,则必须打印
\r
,后跟与行上字符数量相同的空格。

当您开始打印到同一行时,您使用的任何终端都可能会删除整行。没有换行符的回车符可能会开始覆盖同一行。C标准(扩展为
printf
)并不规定这种行为,因此这实际上更多的是关于您的终端的问题。其他字符也是如此。很抱歉,这是一个吹毛求疵的问题,但两个(或更多…)字符也会出现这种情况。所发生的是,所有内容都被写入,但是终端会从初始字符串的末尾开始覆盖。如果“--------------------------”足够长(比提示长),则结尾仍然可见。@kabanus:很好,OP看到这种行为的原因可能是他们的提示覆盖了行的其余部分。同样,这取决于终端仿真器…但如果确实要删除一行,则需要覆盖其所有字符。
#include <stdio.h>

int main(){

    printf("-------");
    printf("\r");
    return 0;

}