首页 新闻 会员 周边 捐助

关于C语言printf("\b");的问题---求解

1
悬赏园豆:5 [已解决问题] 解决于 2011-12-08 13:10

“\b” ,在printf();函数里就是退格的意思,也就是控制光标前移一个字符,在实际使用时确实可以做到,也是比较实用的,比如printf("please input your choice< >\b\b");   ,可以实现把光标聚焦到< >中间,下面再输入内容就在< >中间显示,还是比较美观实用的。如果输入多于一个数字和字母,就会把后面的 > 覆盖掉。
          既然 "\b" 有这个功能,我们很自然地想到把它用到ACM中来,一个很典型的例子就是消除行末空格,空格问题应该是初学者最头疼的问题,稍不注意就会PE(格式错误)。比如在连续输出时,N个数,在每个元素后面都有一个空格,在最后一个元素后面没有空格,一般我们都是先把N-1个数输出来,最后把第N个数以没有空格的方式输出来。现在我们考虑:能不能把N个数都以带空格的方式输出来,最后加上一个printf("\b");来消除最后一个空格?读者可以试一下。不管是输出到屏幕还是输出到文件,都是可以实现的,最后确实没有空格。在做ACM时,我看也有大一的小孩是这么做的。但是,问题是,这样提交上去竟然是”wrong answer"!!!如果不加printf("\b");就是“PE",加上直接就”WA“。我就不明白了,不加的话最起码是答案正确,格式错误;加上连答案都不正确了!     sdutOJ和hduOJ都是这样。也可以用A+B问题做实验,printf("%d",a+b) 就AC,printf("%d \b",a+b)就WA

    求解
ma6174的主页 ma6174 | 菜鸟二级 | 园豆:205
提问于:2011-12-06 15:35
< >
分享
最佳答案
1

你可能不知道acm判断答案的原理,它会将标准输出重定向到文件,然后比较文件是否相同。比如下面的程序:

#include <stdio.h>

int main()
{
printf("1+1=2 \b");
}

你重定向到文件,会发现\b是作为一个字符输出到文件里面的。

比如,上面的代码重定向后,查看文件的16进制是下面的情况

312b 313d 3220 080d 0a

1  +  1   =  2  \s \b \r  \n

20就是空白

08 就是 \b

收获园豆:5
暮夏 | 菜鸟二级 |园豆:391 | 2011-12-06 23:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册