每日一题00008手写printf函数,

示例:

main 函数示例代码:

#include <unistd.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
int main()
{
	self_printf("1+1 = %d\n",1+1);
	self_printf("main function address %p\n",0x7fff34625569);
	self_printf("name: %s\nage: %d\ngender: %s\n","LiBai",18,"Male");
	self_printf("%c %d %p %s\n",'h',1122334,0x5588d363ae1e,"hello");
	self_printf("The weather is nice today, isn't it?\n");
	self_printf("%c %c %c %c %d %d %s",'a','b','c','d',-100,2123,"cool");
	self_printf("%d %d %d\n",-1,-1234567,0);
	self_printf("%f\n",1.23);
	self_printf("%s %w\n","over");
    	return 0;
}

要求输出为:

1+1 = 2
main function address 0x7fff34625569
name: LiBai
age: 18
gender: Male
h 1122334 0x5588d363ae1e hello
The weather is nice today, isn't it?
a b c d -100 2123 cool-1 -1234567 0
Unknown formatting character [*] f
Unknown formatting character [*] w

该题目限定使用 C 语言

代码块:

#include <unistd.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
void self_printf(const char *ch, ...); 
void itos(int number);
void ptos(uintptr_t p);
void hex(uintptr_t num);
void clear();
int main()
{
	self_printf("1+1 = %d\n",1+1);
	self_printf("main function address %p\n",0x7fff34625569);
	self_printf("name: %s\nage: %d\ngender: %s\n","LiBai",18,"Male");
	self_printf("%c %d %p %s\n",'h',1122334,0x5588d363ae1e,"hello");
	self_printf("The weather is nice today, isn't it?\n");
	self_printf("%c %c %c %c %d %d %s",'a','b','c','d',-100,2123,"cool");
	self_printf("%d %d %d\n",-1,-1234567,0);
	self_printf("%f\n",1.23);
	self_printf("%s %w\n","over");
    	return 0;
}
void self_printf(const char* format,...){
	va_list valist;
	
	va_start(valist,format);
	
	for(;;){
		int inv=0;
		const char* cs= format;
		for(;;){
		if(*cs=='\0'){
			break;
		}
		if(*cs=='%'){
			cs++;
			if(*cs=='w'||*cs=='o'||*cs=='x'||*cs=='u'){
				clear();
				write(1,"Unknown formatting character [*] ",33);
				write(1,cs,1);
				write(1,"\n",2);
				va_end(valist);
				inv=1;
				break;	
			}	
		}
		cs++;
	}
	if(inv==1){
		break;
	}
		if(*format=='\0'){
			break;
		}
		if(*format=='%'){
			format++;
            
			if(*format=='d'){
				int  int1= va_arg(valist,int);
				itos(int1);	
			}
			else if(*format=='s'){
				char* str1 = va_arg(valist, char*);
                write(1, str1, strlen(str1));
			}
			else if(*format=='c'){
				char str2=va_arg(valist,int);
				write(1,&str2,1);	
			}
			else if(*format=='p'){
				void* str3=va_arg(valist,void*);
			    ptos((uintptr_t)str3);
			}
			else{
				clear();
				write(1,"Unknown formatting character [*] ",33);
				write(1,format,1);
				write(1,"\n",2);
				va_end(valist);
				format++;
				break;
			}
			format++;
		}
		else{
			write(1,format,1);
			format++;
		}	
	}
	va_end(valist);
}
void itos(int num){
    char str[50]; 
    int bool1=0;
    if (num<0){
        bool1 = 1;
        num=-num;
    }
    int i=0;
    do {
        str[i]=num%10+'0';
        i++;
        num /= 10;
    } while(num>0);
    if (bool1==1){
        str[i]='-';
        i++;
    }
    for (int k=0,j=i-1;k<j;k++,j--){
        char temp=str[k];
        str[k]=str[j];
        str[j]=temp;
    }
    str[i] = '\0';
	write(1,str,strlen(str));
}
void ptos(uintptr_t num){

   hex(num);
}
void hex(uintptr_t num){
    char hex_digits[]="0123456789abcdef";
    char buffer[20];
    int index=0;
    buffer[index++]='0';
    buffer[index++]='x';
    do{
        buffer[index++]=hex_digits[num%16];
        num /= 16;
    }while(num>0);
    for (int i=2,j=index-1;i<j;i++,j--){
        char temp=buffer[i];
        buffer[i]=buffer[j];
        buffer[j]=temp;
    }
    buffer[index]='\0';
    write(1,buffer,index);
}
void clear(){
    fflush(stdout);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值