我观察到一些行为,当使用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优化级别上。
如果我没弄错的话,这与输出缓冲无关。
这种行为是否有意?
答案 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;。