c - 为什么 printf ("%d\n"、 printf ("%d\b"、 a)) 以这种方式工作?

标签 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,打印指针的位置会被记住吗?我的意思是,如果 printf 里面有一个 \b ,它会使打印指针落后一步。当控件现在转到外部 printf 时,是否记住了那个改变的位置?它会覆盖最后一个字符吗?

最佳答案

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 语句导致控制跳转 past 声明 int x = 10;,但进入声明 x 的范围。因此,调用 printf 时,x 未初始化。这会导致未定义的行为,并且很可能导致垃圾输出(我刚刚得到 -1217572876^H12)。如果 x 恰好是 0,我想你会得到 0^H2,它看起来像 2 .

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

关于c - 为什么 printf ("%d\n"、 printf ("%d\b"、 a)) 以这种方式工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12638485/

相关文章:

concat char* 与 char netbea

c - 双指针使用错误

java - 将空格转换为命令行类型空格

html - 如何在C中转义html实体?

bash - bash 中的 printf "-1"给出错误,原因未知

c - 如何循环结构体?

c - 带有比较运算符的 bool 输出

perl - 测试::更多:由于转义序列而导致的糟糕计划

c - 为什么 scanf 会有这样的 react ?

C snprintf 指定用户主目录