printf的实现(不借助stdarg.h中的宏)

实现了%d %x %c %s

对变长函数的参数取址有了深刻的理解 ,蒋yy的实验任务其实还是很有帮助的^_^


 1 int printf ( const char * format, ... )
2 {
3 int Count=0;
4 int index=0;
5 char buffer[32];
6 int t=&format;
7 t+=4;
8 while(*format){
9 if(*format==‘%‘){
10 if(*(format+1)==‘d‘)//10进制整数
11 {
12 format++;
13 int temp=*(int*)t;
14
15 while(temp){
16 buffer[index]=temp%10+48;
17 temp/=10;
18 index++;
19 }
20 index--;
21 while(index>=0){
22 putchar(buffer[index]);
23 index--;
24 }
25 index++;
26 t+=4;
27 }
28 else if(*(format+1)==‘x‘)//16进制整数
29 {
30 format++;
31 int temp=*(int*)t;
32 while(temp){
33 if(temp%16<=9)
34 buffer[index]=temp%16+48;
35 else
36 buffer[index]=temp%16-10+65;
37 temp/=16;
38 index++;
39 }
40 index--;
41 while(index>=0){
42 putchar(buffer[index]);
43 index--;
44 }
45 index++;
46 t+=4;
47 }
48 else if(*(format+1)==‘c‘)//char
49 {
50 format++;
51 char temp=*(char*)t;
52 putchar(temp);
53 t+=4;
54 }
55 else if(*(format+1)==‘s‘)//string
56 {
57 format++;
58 char*temp=*(char**)t;
59 while(*temp){
60 putchar(*temp);
61 temp++;
62 }
63 t+=4;
64 }
65
66 }
67 else putchar(*format);
68 format++;
69
70 }
71
72 return 0;
73 }

时间: 2024-10-14 19:49:23

printf的实现(不借助stdarg.h中的宏)的相关文章

编写一个可变参数的C函数——头文件stdarg.h中宏va_start ,va_arg和va_end的应用

我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的:int printf( const char* format, ...);它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法:printf("%d",i);printf("%s",s);printf("the number is %d ,string is:%s", i, s);究竟如何写可变参数的

#include&lt;stdarg.h&gt; 可变参数使用

今天上计算方法这课时觉得无聊至极,于是拿出C++编程之道来看了看..无意之中看到了#include<stdarg.h> va_list,va_start,va_end等东西,不知是怎么用的,于是很想解决.. 课后速回到宿舍,打开电脑一查才    知道原来是:定义成一个可变参数列表的指针: 于是写下了下面的一小程序加以运用(开发环境为vs2005) #include<stdio.h>#include<stdarg.h>int N=5;void Stdarg(int a1,

#include&lt;stdarg.h&gt;

stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函数能够接收可变参数.C++的cstdarg头文件中也提供这样的功能:虽然与C的头文件是兼容的,但是也有冲突存在. VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件:#include <stdarg.h>,用于获取不确定个数的参数 va_start,函数名称,读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中的参数列表,从低地址到高地址一

C 标准库 - &lt;stdarg.h&gt;

C 标准库 - <stdarg.h> 简介 stdarg.h 头文件定义了一个变量类型 va_list 和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数. 可变参数的函数通在参数列表的末尾是使用省略号(,...)定义的. 库变量 下面是头文件 stdarg.h 中定义的变量类型: 序号 变量 & 描述 1 va_list 这是一个适用于 va_start().va_arg() 和 va_end() 这三个宏存储信息的类型. 库宏 下面是头文件 stdarg.h

stdarg.h——用于函数接受可变参数

stdarg.h是C语言中C标准函数库的头文件,stdarg是由standard(标准) arguments(参数)简化而来,主要目的为让函数能够接收可变参数. 1.可变参数函数 声明可变参数函数 可变参数函数的参数数量是可变动的,它使用省略号来忽略之后的参数.例如printf函数一般.代表性的声明为: int check(int a, double b, ...); 可变参数函数最少要有一个命名的参数,所以 char *wrong(...); 在C中是不被允许的(在C++中,这样的声明是合理的

#include &lt;stdarg.h&gt;

名称描述相容  // 作用描述 va_start使va_list指向起始的参数 va_arg检索参数C89 va_end释放va_list va_copy拷贝va_list的内容 实例解析: #include <stdio.h> #include <stdarg.h> void printargs(int arg1, ...) /* 输出所有int类型的参数,直到-1结束 */  //参数列表中, 后面的元素类型不一定,va_arg()函数的返回类型决定的 { va_list ap

头文件&lt;stdarg.h&gt;

头文件<stdarg.h>声明了一种类型并且定义了三个宏,这样就可以提前访问一个参数表,调用函数在被编译时并不知道这个参数表中参数的数目和类型.其目的是是为了让函数能够接受可变参数. 1.类型:va_list 它是一个保存宏va_start.va_arg和va_end所需要的信息的类型.如果要访问不同的参数,那么调用的函数要声明一个va_list类型的数据对象(假设该数据对象名为ap).对象ap可能作为参数传递给另一个函数.如果那个函数对参数ap调用宏va_arg,那么ap在调用函数中的值是不

使用stdarg.h实现可变长度参数

现在先用一个使用过程讲解一下: ◎用法: func( Type para1, Type para2, Type para3, … ) { /****** Step 1 ******/ va_list ap; va_start( ap, para3 ); //一定要“…”之前的那个参数 ,而且这个参数不能使引用类型,因为引用类型不能根据其地址获取后面参数的地址 /****** Step 2 ******/ //此时ap指向第一个可变参数 //调用va_arg取得里面的值 Type xx = va_

关于&lt;signal.h&gt;中SIG_ERR、SIG_DEL、SIG_IGN定义的问题

linux中signal.h中对对signal的定义是: void (*signal(int signo,void (*func)(int)))(int); 通过typedef可以转换成这样: typedef void Sigfunc(int); Sigfunc *signal(int,Sigfunc *); 也就是说,signal有两个参数,一个是int,一个是Sigfunc ,返回值也是Sigfunc ,该指针指向一个参数为int,无返回值的函数,然而,SIG_ERR的定义是这样的: #de