能实现输入数字 输入字符 数字包括(100末尾有0的数字 INT32_MAX INT32_MIN 负数)
实现代码如下:
#include <stdio.h>
#include <stdarg.h>
#include <inttypes.h>
#include<string.h>
int rev_num(int x1 ,int * temp)
{
*temp=0;
int dight=0;
while(x1){
*temp=*temp*10 +x1%10;
x1/=10;
dight++;
}
return dight;
}
int output_num(int dight ,int temp)
{
int cnt=0;
while (dight--)
{
putchar(temp%10+'0'),cnt++;
temp/=10;
}
return cnt;
}
int my_print(const char* frm,...)
{
int cnt=0;
va_list arg;
va_start(arg,frm);
#define putc(a) putchar(a) ,cnt++
for(int i=0; frm[i] ; i++ )
{
switch(frm[i])
{
case '%':{
switch (frm[++i])
{
case 'd':{
int xx=va_arg(arg,int);
uint32_t x;
if(xx<0) putc('-') , x=-xx;
else x=xx;
int temp1,temp2;
int x1 ,x2;
x1=x/100000,x2=x%100000;
int dight1=rev_num(x1,&temp1);
int dight2=rev_num(x2,&temp2);
cnt+=output_num(dight1,temp1);
cnt+=output_num(dight2,temp2);
}break;
case 's':{
const char* str =va_arg(arg,const char *);
for(int j=0;str[j];j++)
{
putc(str[j]);
}
}break;
}
}break;
default : putc(frm[i]); break;
}
}
#undef putc
va_end(arg);
return cnt;
}
int main()
{
my_print("hello world\n");
my_print("a : %d\n", 123);
my_print("a : %d\n",1000);
my_print("a : %d\n",INT32_MAX);
my_print("a : %d\n",INT32_MIN);
my_print("a : %d\n",INT32_MAX);
my_print("a : %s\n","nihaoniubi");
return 0;
}
运行结果:
注意
- rev_num传入参数temp时,若想在此函数中改变temp的值,需要传入temp的地址,否则传入变量只是一个变量只仅限于函数中,函数结束后,值是不变的
- 在for循环的第二个条件,frm[i];计算机中’\0’表示为0,所以字符数组遍历结束后,遇到’\0’便结束循环
- 注意case 的写法,他的规范
- 在计算机中负数用补码表示 01111111是正数最大 他的补码是10000001,但是负数最小是10000000,所以导致int无法存下 -INT32_MIN,用usigned int ,uint32_t就是无符号整形