示例:
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);
}