BUAA_2023_os_lab1上机总结

发布时间 2023-03-22 21:09:07作者: buaa_nr

依旧是两道题,exam + extra

exam

实现一个自定义的格式化字符串'%R',他的格式和%d完全相同,但是输出的值不同,具体地可以说:
printf("%...R",a,b);
等价于:
printf("(%...d,%...d)",a,b);
没错,%R可以从当前参数位往后读取两个参数。
其中,"..."表示用来控制输出格式的那一堆东西,%R的那一堆东西和%d的完全相同。

extra

实现一个sprintf(char *buf, const char* fmat, ...)函数,可以将格式化字符串写入buf字符数组中,同时返回写入buf的字符数量
实现要点:
自定义一个myoutputk函数来传给vprintfmt,里面要实现这样的功能:将要输入的内容从原本的写入控制台地址变为写入data->addr字符串地址。
注意!!myoutputk函数写入后,一定要在这次调用myoutputk函数的末尾加上为data->addr末尾添'\0'的代码,不然就bug,字符串需要以'\0'来作为其结束的标记。

比较阴间的点在于如何在myoutputk函数里修改地址的值以及长度(处理一个格式化字符串,vprintfmt函数可能会多次调用myoutputk函数,因此每次写入的时候要实时更新地址,不然的话就会始终写入原始的首地址),我们知道想要在函数中修改参数变量的值的话,需要传进来它的地址,我们可以定义一个结构体,这个结构体:

typedef struct {
  char *addr;
  size_t length;
} Data;

这样的话只要将结构体的地址传给myoutputk的char *data参数,就可以改变其地址上的值了。