windows和linux和Dos三种 *** 作系统的printf源码应该是略有区别的。
printf是在屏幕上打印一个字符串的函数。
(注:数字其实也是按照字符的形式显示在屏幕上的。)
因为printf其实是解析format格式,例如%d,\n,等等。
真正在屏幕上显示的函数是决定与 *** 作系统底层的。
也就是都是调用底层的显示策略函数实现的在屏幕的指定位置进行显示。
例如:stdio.h中的printf.c的源码中:
printChar函数就是顶层的显示策略函数。
code]int putchar (int c) {
switch ((unsigned char) c) {
case '\n' :
newLine ()
break
case '\r' :
carriageReturn ()
break
case '\f' :
clearScreen ()
break
case '\t' :
printChar (32)printChar (32)/* 32 = space */
printChar (32)printChar (32)
printChar (32)printChar (32)
printChar (32)printChar (32)
break
case '\b':
backspace ()
break
case '\a':
beep ()
break
default :
printChar ((unsigned char) c)
}
return c
}[/code]
接下来看printChar也就是输出部分最低层的 *** 作咯
[code]void printChar (const byte ch) {
*(word *)(VIDEO + y * 160 + x * 2) = ch | (fill_color <<8)
x++
if (x >= WIDTH)
newLine ()
setVideoCursor (y, x)
}[/code]这里VIDEO表示显存地址也就是0xB8000.通过 y * 160 + x 屏幕(x,y)坐标在显存中的位置.这里需要知道,一个字符显示需要两个字节,一个是ASCII码,第二个是字符属性代码也就是颜色代码.因此才必须 y * 80 * 2 + x = y * 160 + x.那么ch | (fill_color <<8)也自然就是写入字符及属性代码用的了.每写一个字符光标位置加1,如果大于屏幕宽度WIDTH就换行.最后通过setVideoCursor设置新的光标位置.完成了整个printChar过程.
如果非要补0,有2个办法1,如果输入的串全是数字,那么atoi一下
2,如果输入的串里有字母,那么你最好定义一个全’0‘的数组,然后memcpy,这个麻烦点,需要算
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)