2015-02-01 YongHao Hu
C++
因为要修复Wine的Bug,需要重新实现sprintf, 于是我研究了wine中printf跟sprinf的实现。 其实printf跟sprintf实现的关键无非就是可变参数,利用此就可以写出一个功能简单的printf. 我仔细研究了一下Wine里面的实现,发现printf跟sprintf的实现核心都用到了pfprintfa(就是根据参数%f,%d等转换的函数),不过重定向不一样。 printf是用到了write_concole, sprintf是复制到buf里面~ 实际上, printf这个我们常用的函数, 申请了内存, 用buf来存放输出的结果. 继续阅读 »
2016-09-18 ruki
tbox内置的libc库,有一份自有的printf实现,在支持了所有标准格式化参数的同时,也对其进行了一些扩展,来支持自定义的格式化参数打印, 例如: ```c // 输出定点数:3.14 tb_printf("%{fixed}\n", tb_float_to_fixed(3.14)); // 输出ipv4地址:127.0.0.1 tb_ipv4_t addr; tb_ipv4_set(&addr, "127.0.0.1"); tb_printf("%{ipv4}\n", &addr); ``` 以上两种都是TBOX内置的对象参数打印,你只需要吧你需要打印的对象名和对象描述函数注册进来,就行了。 其中%{ob 继续阅读 »
2016-05-11 YongHao Hu
C++
大家先看看下面的程序: ``` include include int main(void) { char* c = (char*)malloc(100); c[0] = 'w'; c[1] = 'o'; printf("%s\n", c); free(c+2); printf("%s\n", c); return 0; } ``` 继续阅读 »
2015-02-15 YongHao Hu
C++
亲爱的程序猿们,你们肯定都用过printf吧?你们知道,看起来理所当然的简单的printf,实际上是个难倒众多计算机科学家的难题吗?直到1971年,才有我们的毒师Mr.White科学家(Jon White)解决这个问题,直到1990年,我们的Mr.White才正式发表这算法的最终版本,Dragon4, 在随后到最近的几十年来,语言上的各种浮点数打印字符串都是用Dragon4算法,其他人的研究都只是对这个算法修修补补,直到Grisu算法的出现。Grisu算法由Florian Loitsch发表,64位的浮点数可以用它表示,但是有0.6%的依然要用Dragon4算法来表示。 因此,要是想做轮子,无论如何都要懂Dragon4算法!!! 继续阅读 »
2018-03-05 YongHao Hu
go
/* #include */ /* #include */ int main(){ char *c = malloc(10); c[0] = 'a'; printf("hi, "); printf("%s\n", c); free(c); return 0; } 为什么这个程序缺了头文件, 依然可以正常编译运行, 并且有正确的结果? 继续阅读 »
2016-05-20 LEo
开发中常需要获取机器的mac地址或者ip,本文通过go获取机器上所有mac地址和ip,详细代码如下: ```go package main import ( "fmt" "net" ) func getMacAddrs() (macAddrs []string) { netInterfaces, err := net.Interfaces() if err != nil { fmt.Printf("fail to get net interfaces: %v", err) return macAddrs } 继续阅读 »
2016-07-16 ruki
首先我们通过内置的工程模板创建一个空工程: ```bash $ xmake create -P ./hello create hello ... create ok!👌 ``` 这个时候xmake将会产生一些工程文件,如下: ```bash $ cd ./hello $ tree . . ├── src │   └── main.c └── xmake.lua ``` 这个简单的程序仅仅只是为了打印输出: hello xmake! ```bash $ cat ./src/main.c include int main(int argc, char** argv) { printf("hello xmak 继续阅读 »
2014-08-29 Mithrilwoodrat
[CDATA[<p class="text" #include include typedef unsigned char * byte_pointer; unsigned replace_byte(unsigned x,unsigned char b,int i); int main() { unsigned x = 0x12345678; unsigned char b =0xab; int i = 0; scanf("%d",&i); printf("%x",replace_byte(x,b,i)); return 0; } unsigned replace_byte(un 继续阅读 »
2014-08-29 Mithrilwoodrat
#include <stdio.h> #include<limits.h> /* return last byte of x or other bytes of y*/ unsigned bytefun(unsigned x,unsigned y) { return ((x<<24)>>24)|(y&(UINT_MAX-0xff)); } int main() { unsigned x = 0x89ABCDEF; unsigned y = 0x76543210; printf("%x",bytefun(x,y)); return 0; } 继续阅读 »
2014-07-18 刘太华
上代码: {} package main import ( "fmt" ) func xrange() chan int { var ch chan int = make(chan int) go func() { for i := 2; ; i++ { fmt.Printf("xrange about to send %d\n", i) ch 继续阅读 »