可能重复:
如何转到 C 代码中的上一行
我想删除最后\n
一个
for(i = 0; i < 10; i++)
printf("****\n");
这似乎\b
不起作用。我应该怎么办?
最好的解决方案是根本不打印它:
for(i = 0; i < 10; i++) printf("****%s", ((i!=9)?"\n":""));
或者使用两个 printfs(具有相同的效果,只是代码多一点,更容易阅读):
for(i = 0; i < 10; i++) {
printf("****");
if (i != 9 ) {
printf("\n");
}
}
printf("****");
for(i = 0; i < 9; i++)
printf("\n****");
这与 Ivaylo 给出的答案基本相同,但您无需检查每次迭代的条件,而是将其完全移出:
for(i = 0; i < 9; i++)
printf("****\n");
printf("****");
现在,您是否需要这种微优化是另一回事。
没有由 C 标准定义的字符序列用于光标定位,将光标向上移动一行(或移至先前的文本缓冲区)。所以没有 100% 可移植的方式来做到这一点。
但是,根据您的平台,大多数终端控制台都支持ANSI 转义码,在这种情况下您可以执行以下操作:
for(i = 0; i < 10; i++)
printf("****\n");
printf("\033[A\033[C\033[C\033[C\033[C");
这使用转义序列将光标向上移动一行 ( \033[A
),然后将其向前移动一个字符 ( \033[C
) 完成 4 次以移过 4 个星号。因此,您将获得在换行符上“向后”移动的效果。
在更清晰的意义上,您可以将其放在#define
:
#define BACKUP_NEWLINE "\033[A\033[C\033[C\033[C\033[C"
for(i = 0; i < 10; i++)
printf("****\n");
printf("%s", BACKUP_NEWLINE);
更好的解决方案(至少硬编码较少)可能是在 Windows 上使用curses 库或类似的库。
替代方法:
你可以使用下面的代码:-)
int t;
for(i = 0; i < 10; i++)
t=printf("****\n"); // t would hold number of characters printed.
printf("\033M\033[%dC",t-1);
它使用 2 个转义字符:
如果您的 printf 恰好包含其他空白字符,例如 \n、\t 等,则需要使用一些逻辑进行计算,以找到水平光标位置。
另一种方法是:
for(i = 0; i < 10; i++)
printf("****\033[s\n"); // \033[s would save column number
printf("\033M\033[u");
有关 ANSI 转义字符的更多详细信息:-)
没有明确定义的便携式方法可以做到这一点,您只能更改当前行的字符,如标准所述:
\b
(退格)将活动位置移动到当前行的前一个位置。如果活动位置在一行的初始位置,则显示设备的行为是未指定的。
其他答案已经证明了做你需要的不同方法。