因为要修复Wine的Bug,需要重新实现sprintf,
于是我研究了wine中printf跟sprinf的实现。
其实printf跟sprintf实现的关键无非就是可变参数,利用此就可以写出一个功能简单的printf.
我仔细研究了一下Wine里面的实现,发现printf跟sprintf的实现核心都用到了pfprintfa(就是根据参数%f,%d等转换的函数),不过重定向不一样。
printf是用到了write_concole, sprintf是复制到buf里面~
实际上, printf这个我们常用的函数, 申请了内存, 用buf来存放输出的结果.
继续阅读 »
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
继续阅读 »
大家先看看下面的程序:
```
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;
}
```
继续阅读 »
亲爱的程序猿们,你们肯定都用过printf吧?你们知道,看起来理所当然的简单的printf,实际上是个难倒众多计算机科学家的难题吗?直到1971年,才有我们的毒师Mr.White科学家(Jon White)解决这个问题,直到1990年,我们的Mr.White才正式发表这算法的最终版本,Dragon4,
在随后到最近的几十年来,语言上的各种浮点数打印字符串都是用Dragon4算法,其他人的研究都只是对这个算法修修补补,直到Grisu算法的出现。Grisu算法由Florian Loitsch发表,64位的浮点数可以用它表示,但是有0.6%的依然要用Dragon4算法来表示。
因此,要是想做轮子,无论如何都要懂Dragon4算法!!!
继续阅读 »
/* #include */
/* #include */
int main(){
char *c = malloc(10);
c[0] = 'a';
printf("hi, ");
printf("%s\n", c);
free(c);
return 0;
}
为什么这个程序缺了头文件, 依然可以正常编译运行, 并且有正确的结果?
继续阅读 »
开发中常需要获取机器的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
}
继续阅读 »
首先我们通过内置的工程模板创建一个空工程:
```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
继续阅读 »
[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
继续阅读 »
#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;
}
继续阅读 »
上代码:
{}
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
继续阅读 »