为什么printf(“%d \ n”,printf(“%d \ b”,a))以这种方式工作?

时间:2012-09-28 10:43:32

标签: c escaping printf

这是我的C代码,用gcc编译。

#include<stdio.h>

int main() 
{ 
    int a=1; 
    switch(a)
    {
       int x=10;
       case 1:
           printf("%d\n",printf("%d\b",x));
           break;
       default:
           printf("%d\n",printf("%d\b",x));
    }
    return 0;
}

printf()应该返回它成功打印的元素数量。 printf("%d\b", x)本身应该打印10(因为\ b将打印指针后退一步(到10中的数字0),之后没有任何内容可以打印。 所以它应该只打印10.这是2个字符。现在外部printf将显示2。 输出应该是102。 我实际看到的输出是2。

如果嵌套printf s是记住打印指针的位置?我的意思是,如果内部\b中有printf,则打印指针会落后一步。当控件现在转到外部printf时,记住改变的位置了吗?它会覆盖最后一个角色吗?

1 个答案:

答案 0 :(得分:5)

printf("%d\b",x)

打印字符'1''0'(因为x == 10)和\b\b是退格符;如果您打印到终端,它将打印10,然后将光标移回一列。

printf的调用会返回打印的字符数;在这种情况下,结果是3(是的,'\b'计为一个字符)。

printf("%d\n",printf("%d\b",x));

内部printf调用的工作原理如上所述,并返回3.外部printf调用打印"3\n"

所以整个声明将打印出来:

10\b3\n

'\b'导致3替换屏幕上的0,因此最终显示的结果(当我在我的系统上运行程序时)是:

13

如果我通过cat -v管道输出,我得到:

10^H3

其中^H表示退格符。

编辑:

问题刚刚被编辑,修改后的程序的行为完全不同。 switch语句使控件跳过过去声明int x = 10;,但进入声明x的范围。因此,x在调用printf时未初始化。这会导致未定义的行为,并且很可能是垃圾输出(我刚刚得到-1217572876^H12)。如果x恰好是0,我认为您会得到0^H2,这看起来像2

无论您想做什么,请找到更好的方法。