BUAA OS 2025 LAB1 EXAM & EXTRA

也许能帮到后来的同学们

LAB1 EXAM

题目

A => B的行驶输出一个字符串和一个数字,标识符为k,其余要求同其他标识符

只要printk的实现比较了解就很好解决。

case 'k':
            s = (char *)va_arg(ap,char *);
            if (long_flag) {
                num = va_arg(ap, long int);
            } else {
                num = va_arg(ap, int);
            }
            neg_flag = num < 0;
            num = neg_flag ? -num : num;
            print_str(out,data,s,width,ladjust);
            print_str(out,data,ss,0,0);
            print_num(out, data, num, 10, neg_flag, width, ladjust, padc, 0);
            break;

LAB1 EXTRA

实现"文件操作",

typedef struct {
    char *ptr;
    char *base;
    char *end;
} FILE;

FILE *fmemopen(FILE *stream, void *buf, const char *mode);
int fmemprintf(FILE *stream, const char *fmt, ...);
int fseek(FILE *stream, long offset, int fromwhere);
int fclose(FILE *stream);

然而实际上地址都是在 FILE中给出的,直接在地址中写入,并且控制指针的移动即可。
有很多的判断,不过只要认真阅读题面即可解决。
要注意的是控制符是一个字符串,所以不能只判断第一个字符

FILE *fmemopen(FILE *stream, void *buf, const char *mode){
    if(strcmp(mode,"w")==0){
        stream->ptr=(char *)buf;
        stream->base=(char *)buf;
        stream->end=(char *)buf;
        return stream;
    }else if(strcmp(mode,"a")==0){
        stream->base=(char *)buf;
        char * tmp=(char *)buf;
        while((*tmp)!='\0') tmp++;
        stream->end=tmp;
        stream->ptr=tmp;
        return stream;
    }
    return NULL;
}
void outputf(void *data,const char *buf,size_t len){
    FILE * stream=(FILE * )data;
    for(int i=0;i<len;++i){
        *(stream->ptr)=buf[i];
        stream->ptr++;
        res++;
    }
    while(stream->end<stream->ptr)
        stream->end++;
    return ;
}
int fmemprintf(FILE *stream, const char *fmt, ...){
    va_list ap;
    va_start(ap, fmt);
    //我必须自己完成
    res=0;
    vprintfmt(outputf,stream,fmt,ap);
    //
    va_end(ap);
    return res;
}
int check(FILE *straem,char * aim){
    if(aim<=straem->end&&aim>=straem->base)
        return 0;
    return -1;
}
int fseek(FILE *stream, long offset, int fromwhere){
    if(fromwhere!=SEEK_CUR&&fromwhere!=SEEK_END&&fromwhere!=SEEK_SET){
        return -1;
    }
    if(fromwhere==SEEK_SET){
        if(check(stream,stream->base+offset)==-1)
            return -1;
        stream->ptr=stream->base;
    }
    if(fromwhere==SEEK_CUR){
        if(check(stream,stream->ptr+offset)==-1)
            return -1;
        stream->ptr=stream->ptr;
    }
    if(fromwhere==SEEK_END){
        if(check(stream,stream->end+offset)==-1)
            return -1;
        stream->ptr=stream->end;
    }
    while(offset){
        stream->ptr++;
        offset--;
    }
    return 0;
}
int fclose(FILE *stream){
    (*stream->end)='\0';
    return 0;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇