通过'%c'

时间:2017-03-22 13:21:18

标签: c printf newline

我观察到一些行为,当使用printf通过format-string打印字符时,我无法解释自己。 似乎当字符是换行符('\ n')时,printf忽略所有内容(包括)'%c'并打印剩余部分。

这是一个最小的示例(禁用优化的用户输入):

#include <stdio.h>
int main(){
  int c;    
  scanf("%d", &c); //read char by ascii id
  printf("FOO%cBAR (id %i)\n", c,c);
  return 0;
}

输入45(' - '的代码)导致输出“FOO-BAR”,但输入13('\ n')只打印“BAR”。这种情况发生在linux上的gcc 6.3.1和clang 3.9.1,-Og和-O3优化级别上。

如果我没弄错的话,这与输出缓冲无关。

这种行为是否有意?

2 个答案:

答案 0 :(得分:1)

那是因为角色13是&#34;回车&#34;。

之后,邮件的第一部分被覆盖。

换行符是字符10。

答案 1 :(得分:1)

来自this answer

\ r是回车并将光标向后移动,就像我要做的那样 -

printf("stackoverflow\rnine")
ninekoverflow

表示它已将光标移动到&#34; stackoverflow&#34;的开头。并且覆盖了自&#34;九&#34;以来的起始四个字符。是四个字符长。

在这种情况下,

BAR (id %i)\n

将覆盖&#34; FOO&#34;。