1

我有一个非常奇怪的回车问题。我尝试多次重写一行,如果该行没有空格,它工作正常,如果它有空格,则不起作用。例如这段代码

printf("                                                                          ");
printf("\rtest test");
printf("                                                                          ");
printf("\rtest test");
printf("                                                                          ");
printf("\rtest test");
printf("                                                                          ");
printf("\rtest test");

将键入 4 行“测试测试”,而此代码

printf("                                                                          ");
printf("\rtest");
printf("                                                                          ");
printf("\rtest");
printf("                                                                          ");
printf("\rtest");
printf("                                                                          ");
printf("\rtest");

将键入一行“测试”。问题是什么?我希望能够重写任何行,不管它是否有空格。

4

2 回答 2

8

\r将光标移动到 tty 上物理行的开头。如果上一次打印将光标换行到下一行(即空格数+“文本文本”中的字符数大于显示的宽度),则光标在下一个物理行上。你需要使用更复杂的转义序列来完成你想要的。(即,保存/恢复光标位置。)作为一个例子(这不是可移植的,但在许多情况下都有效),你可以这样做:

fputs( "\0337", stdout );  /* Save the cursor position */
printf( " ... " );
fputs( "\0338", stdout );  /* restore cursor position */

请注意,如果光标位于屏幕底部,这可能不会完全符合您的要求。位置将保存在屏幕底部,多行输出滚动,光标恢复到屏幕底部。

于 2013-01-07T13:56:35.680 回答
0

要在新行上打印,请使用换行符 ('\n') 而不是回车。

'\r' 在控制台上的行为是返回到当前行的开头。在这种情况下,在第一个实例中强制换行的是大量的空间填充。

在某些情况下,终端可以配置为将 CR 转换为 CR+LF。严格来说,'\n' 只是一个 LF 字符,它向下移动一行而不返回到开头,但标准输出的正常行为是将其转换为 CR+LF。

于 2013-01-07T14:21:46.517 回答