加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在C中编写自己的printf()?

发布时间:2020-12-16 03:13:21 所属栏目:百科 来源:网络整理
导读:实际上我正在尝试使用varags在C中编写自己的printf().但我没有得到正确的解决方案.谁能帮我吗? 解决方法 在实现printf()函数之前,我们必须处理异常问题,即可变参数.我们知道printf除了字符串之外还可以使用很多参数. 所以我们必须使用一个名为stdarg.h的标
实际上我正在尝试使用varags在C中编写自己的printf().但我没有得到正确的解决方案.谁能帮我吗?

解决方法

在实现printf()函数之前,我们必须处理异常问题,即可变参数.我们知道printf除了字符串之外还可以使用很多参数.
所以我们必须使用一个名为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 != ''; 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 = ''; 

    do 
    { 
        *--ptr = Representation[num%base]; 
        num /= base; 
    }while(num != 0); 

    return(ptr); 
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读