实际上我正在尝试使用varags在C中编写自己的printf().但我没有得到正确的解决方案.谁能帮我吗?
解决方法
在实现printf()函数之前,我们必须处理异常问题,即可变参数.我们知道printf除了字符串之外还可以使用很多参数.
所以我们必须使用一个名为stdarg.h的标准库来处理这个变量参数问题.在这个实现上下文中,我们不需要学习整个stdarg.h库,因为我们使用这些库的一些宏函数,这是我们的C程序可以直接理解的.
所以我们必须使用一个名为stdarg.h的标准库来处理这个变量参数问题.在这个实现上下文中,我们不需要学习整个stdarg.h库,因为我们使用这些库的一些宏函数,这是我们的C程序可以直接理解的.
Here is the code source which explain nice and fast
#include<stdio.h> #include<stdarg.h> void Myprintf(char *,...); //Our printf function char* convert(unsigned int,int); //Convert integer number into octal,hex,etc. int main() { Myprintf(" WWW.FIRMCODES.COM \n %d",9); return 0; } void Myprintf(char* format,...) { char *traverse; unsigned int i; char *s; //Module 1: Initializing Myprintf's arguments va_list arg; va_start(arg,format); for(traverse = format; *traverse != '\0'; traverse++) { while( *traverse != '%' ) { putchar(*traverse); traverse++; } traverse++; //Module 2: Fetching and executing arguments switch(*traverse) { case 'c' : i = va_arg(arg,int); //Fetch char argument putchar(i); break; case 'd' : i = va_arg(arg,int); //Fetch Decimal/Integer argument if(i<0) { i = -i; putchar('-'); } puts(convert(i,10)); break; case 'o': i = va_arg(arg,unsigned int); //Fetch Octal representation puts(convert(i,8)); break; case 's': s = va_arg(arg,char *); //Fetch string puts(s); break; case 'x': i = va_arg(arg,unsigned int); //Fetch Hexadecimal representation puts(convert(i,16)); break; } } //Module 3: Closing argument list to necessary clean-up va_end(arg); } char *convert(unsigned int num,int base) { static char Representation[]= "0123456789ABCDEF"; static char buffer[50]; char *ptr; ptr = &buffer[49]; *ptr = '\0'; do { *--ptr = Representation[num%base]; num /= base; }while(num != 0); return(ptr); }