linux shell awk printf怎么对数字右补0,是右补0

linux shell awk printf怎么对数字右补0,是右补0,第1张

由于printf很难右边补零这样的特性,可以换一种方式,作为字符串处理echo 12145 | awk '{width=10printf("%d",$1)for(i=0i<width-length($1)++i) printf "0"print ""} '其中width为指定的宽度

首先,总结性地回答:

windows和linux和Dos三种 *** 作系统的printf源码应该是略有区别的。

其次,介绍一下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,这个麻烦点,需要算


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/8338589.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存