回车时我有一个非常奇怪的问题。我尝试多次重写一行,如果行没有空格则工作正常,如果有空格则不行。例如这段代码
printf(" ");
printf("\rtest test");
printf(" ");
printf("\rtest test");
printf(" ");
printf("\rtest test");
printf(" ");
printf("\rtest test");
将在此代码中输入4行“test test”
printf(" ");
printf("\rtest");
printf(" ");
printf("\rtest");
printf(" ");
printf("\rtest");
printf(" ");
printf("\rtest");
将键入单行“test”。问题是什么?如果它有空格,我希望能够重写任何行。
答案 0 :(得分:8)
\r
将光标移动到tty上物理线的开头。如果前一个打印将光标包装到下一行(即,空格数+“文本文本”中的字符数大于显示的宽度),则光标位于下一个物理行上。您需要使用更复杂的转义序列来完成您想要的任务。 (即保存/恢复光标位置。)作为示例(这不是可移植的,但在许多情况下都有效),您可以这样做:
fputs( "\0337", stdout ); /* Save the cursor position */
printf( " ... " );
fputs( "\0338", stdout ); /* restore cursor position */
请注意,如果光标位于屏幕底部,则可能无法完全按照您的要求进行操作。位置将保存在屏幕底部,多行输出将滚动,光标将恢复到屏幕底部。
答案 1 :(得分:0)
要在新行上打印,请使用换行符('\ n')而不是回车符。
控制台上'\ n'的行为是返回当前行的开头。在这种情况下,大量的空间填充在第一个实例中强制换行。
在某些情况下,终端可以配置为将CR转换为CR + LF。严格来说'\ n'只是一个LF字符,它向下移动一行而不返回到开始,但stdout的正常行为是将其转换为CR + LF。