0

可能重复:
如何转到 C 代码中的上一行

我想删除最后\n一个

for(i = 0; i < 10; i++)
     printf("****\n");

这似乎\b不起作用。我应该怎么办?

4

6 回答 6

8

最好的解决方案是根本不打印它:

for(i = 0; i < 10; i++) printf("****%s", ((i!=9)?"\n":""));

或者使用两个 printfs(具有相同的效果,只是代码多一点,更容易阅读):

for(i = 0; i < 10; i++) {
  printf("****");
  if (i != 9 ) {
    printf("\n");
  }
}
于 2013-01-18T12:33:09.847 回答
2
printf("****");
for(i = 0; i < 9; i++)
     printf("\n****");
于 2013-01-18T12:36:51.707 回答
1

这与 Ivaylo 给出的答案基本相同,但您无需检查每次迭代的条件,而是将其完全移出:

for(i = 0; i < 9; i++)
    printf("****\n");

printf("****");

现在,您是否需要这种微优化是另一回事。

于 2013-01-18T12:37:49.367 回答
1

没有由 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 库或类似的库。

于 2013-01-18T13:33:47.013 回答
0

替代方法:

  1. 如果您使用的是符合 ansi 的终端,&
  2. 您的 printf 不使用除 ' '(空格)以外的任何空白字符(例如 \t、\n、\v 等),

你可以使用下面的代码:-)

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 个转义字符:

  1. <ESC>M : 移到上一行,但第一列
  2. <ESC>[<num>-C :向右移动 <num> 个位置。

如果您的 printf 恰好包含其他空白字符,例如 \n、\t 等,则需要使用一些逻辑进行计算,以找到水平光标位置。

另一种方法是:

for(i = 0; i < 10; i++)
   printf("****\033[s\n");      // \033[s would save column number
printf("\033M\033[u");

有关 ANSI 转义字符的更多详细信息:-)

于 2013-01-18T13:10:18.957 回答
0

没有明确定义的便携式方法可以做到这一点,您只能更改当前行的字符,如标准所述:

\b退格)将活动位置移动到当前行的前一个位置。如果活动位置在一行的初始位置,则显示设备的行为是未指定的。

其他答案已经证明了做你需要的不同方法。

于 2013-01-18T12:38:54.403 回答