首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

VC6 中 printf 中的退格(\b)为啥不会老老实实地删掉一个字符

2012-09-15 
VC6 中 printf 中的退格(\b)为什么不会老老实实地删掉一个字符?在这种情况下显示正常:C/C++ code#include

VC6 中 printf 中的退格(\b)为什么不会老老实实地删掉一个字符?
在这种情况下显示正常:

C/C++ code
#include <stdio.h>void main(){    int a,b,c;    a = 0;    b = 1;    c = 2;    printf(">>>%d-%d\t\b%d\n",a,b,c);}

运行效果为:
>>>0-12

但如果前面加个换行符就不正常了:
C/C++ code
#include <stdio.h>void main(){    int a,b,c;    a = 0;    b = 1;    c = 2;    printf("\n>>>%d-%d\t\b%d\n",a,b,c);}

运行效果为:

>>20-1

这还有个更奇怪的:
C/C++ code
#include <stdio.h>void main(){    int a,b,c;    a = 0;    b = 1;    c = 2;    printf("%d%d%d\n>>%d-%d\t\b%d\n",a,b,c,a,b,c);}

运行效果为:
012
>>0-2

这是 VC6 的 BUG 还是我对转移字符的理解有不对的地方?

[解决办法]
不能算是BUG,对于\b的解释并没有非常统一的标准。
[解决办法]
C/C++ code
printf(">>>%d-%d\t\b%d\n",a,b,c);
[解决办法]
换用cprintf
#include <conio.h>
cprintf
[解决办法]
或者在cmd窗口中输入命令:
你的exe名字 >out.txt

然后用WinHex软件或UltraEdit软件的字节模式查看out.txt文件中的原始字节内容。
[解决办法]
打印时,\b不会删除字符,只是将光标前移一位,不过楼主这个结果移动得比较奇怪
在c++的 std::cout中是正常的,不知道printf是个什么机制。
mark.
[解决办法]
想知道printf是什么机制:

http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express
右边Visual C++ 2010 Express下面的Select language...下拉选‘简体中文’,再按Install Now按钮

再参考
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c

或者在Visual C++ 2010 Express中单步到printf语句之前,然后按Alt+8,F11
[解决办法]
vs2010 不仅跳过了 tab 产生的 空格,而且删除了 1
[解决办法]
c 中本来就没有 基本的输入输出函数,调用 os 的
[解决办法]
探讨

c 中本来就没有 基本的输入输出函数,调用 os 的

[解决办法]
printf中\b后光标移动过多了,移动某些字符下面继续打印就把原字符给替换了。
试了下,win7 VS2008
-----------------------
std::cout 是在下面这个函数中将字符串分解后最终调用API函数WriteFile,每次写入单个字符,结果正常。
C/C++ code
virtual streamsize __CLR_OR_THIS_CALL xsputn(const _Elem *_Ptr,        streamsize _Count)
[解决办法]
windows里,输出到屏幕上退格(\b)不会表现出来。。
如果输出到打印机上或者输出至文件,退格才能体现出退格的真正作用,相当于对退格这个字符做了模拟人控制的处理。。。
[解决办法]
探讨
在这种情况下显示正常:

C/C++ code

#include <stdio.h>
void main()
{
int a,b,c;
a = 0;
b = 1;
c = 2;
printf(">>>%d-%d\t\b%d\n",a,b,c);
}

运行效果为:
>>>0-12

但如果前面加个换行符就不正常了:

……

热点排行