如果行包含空格,则C中的回车符不能正常工作

时间:2013-01-07 13:51:51

标签: c carriage-return

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

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”。问题是什么?如果它有空格,我希望能够重写任何行。

2 个答案:

答案 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。