zoukankan      html  css  js  c++  java
  • 【C语言】模拟实现printf函数(可变参数)

    一、printf函数介绍

    printf功能

    printf函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。

    printf原型

    int printf( const char* format , [argument] ... ); //定义在stdio.h中

    以上部分来自于高小调博客(一个UI非常好,没有广告,纯绿色的博客,建议大家收藏)

    二、利用可变参数列表模拟实现printf

    1.分析printf函数

    printf("Hello haohaosong! ");

    printf("%s","Welcome to my bolg ");

    printf("hell%c ",'o');

    我们发现,printf函数的参数是不确定的

    传参的地方必须使用其他东西

    2.解决方法

    利用stdarg宏来解决可变参数问题

    头文件:<stdarg.h>

    va_list;

    type va_arg( va_list arg_ptr, type );

    void va_end( va_list arg_ptr );

    void va_start( va_list arg_ptr, prev_param );   (ANSI version)

    在VC6.0下,我们转到定义出,可以清晰发现这些宏的定义:


    分析

    va_list 是用宏定义的标识符,是指向字符类型的指针

    va_start(ap,v)  取出va_list 定义的变量的地址,并加上可变元素的数目

    va_arg(ap,t) 每次取指针指向的内容,并在宏的内部将指针后移

    va_end(ap) 将原指针指向空,以防止野指针的出现

    三、具体代码

    代码块:

    #include<stdio.h>
    #include<stdarg.h>
    int my_printf(char* str,...)
    {
    	va_list arg;//定义char* 变量 arg
    	int count = 0;
    	char* str_tmp = NULL;
    	va_start(arg,str);//为arg进行初始化
    	while(*str != '')
    	{	
    		switch(*str)
    		{
    			case 'c':
    				putchar(va_arg(arg,int));//取下一个参数的字符,并打印
    				count++;
    				break;
    			case 's':	
    				str_tmp = (char*)va_arg(arg,int);//取下一个参数的地址,因为这个是字符串
    				while(*str_tmp != '')//利用解引用进行输出
    				{		
    					putchar(*str_tmp);
    					count++;
    					str_tmp++;	
    				}
    				break;
    			default:
    				putchar(*str);	//不为'c'或's',那么直接将它打印
    				count++;
    				break;	
    		}
    		str++;		
    	}
    	va_end(arg);//将arg指向空,防止野指针
    	return count;
    }
    int main()
    {	
    	my_printf("s ccc","hello",'H','h','s');
    	return 0;
    }

    运行结果:

  • 相关阅读:
    字符编码中的英文字母、汉字占有的字节长度。
    Socket Programming in C#--Conclusion
    Socket Programming in C#--Server Side
    Socket Programming in C#--Multiple Sockets
    Socket Programming in C#--Getting Started
    Socket Programming in C#--Introduction
    针对Model类的代码修剪器
    Mybatis 代码生成器(集成通用Mapper)
    MySQL 常用字段类型与对应的Java类型
    @RestController和@GetMapping
  • 原文地址:https://www.cnblogs.com/qq329914874/p/5990316.html
Copyright © 2011-2022 走看看