C 可变参数

#include <stdio.h>
#include <stdarg.h>

extern char* baseconv(unsigned int,int); //格式化数字

void miniprintf(const char *fmt,...)
{
    const char* p;
    int i;
    unsigned u;
    char* s;
    va_list argp;
    va_start(argp,fmt);

    for(p=fmt;*p!=‘\0‘;p++)
    {
        if(*p!=‘%‘)
        {
            putchar(*p);
            continue;
        }

        switch(*++p)
        {
            case ‘c‘:
                i=va_arg(argp,int);//“默认参数提升”规则,在可变参数部分
                putchar(i);
                break;
            case ‘d‘:
                i=va_arg(argp,int);
                if(i<0)
                {
                    i=-i;
                    putchar(‘-‘);
                }
                fputs(baseconv(i,10),stdout);
                break;
            case ‘o‘:
                u=va_arg(argp,unsigned int);
                fputs(baseconv(u,8),stdout);
                break;
            case ‘s‘:
                s=va_arg(argp,char*);
                fputs(s,stdout);
                break;
            case ‘u‘:
                u=va_arg(argp,unsigned int);
                fputs(baseconv(u,10),stdout);
                break;
            case ‘x‘:
                u=va_arg(argp,unsigned int);
                fputs(baseconv(u,16),stdout);
                break;
            case ‘%‘:
                putchar(‘%‘);
                break;
        }
    }
    va_end(argp);
}

关于可变参数的部分,仔细想想的话:应该是把所有的参数放到了一个块内存中,然后将数据一个个取出来。但是取出来的时候要定义类型,每个类型确定了取出来的内存的大小。

ps:定义函数时第一个参数不能缺少吧,然参数的开始地址怎么找,至少要给个名字(地址)

va_arg(argp,var_Type);
时间: 2024-12-28 16:28:52

C 可变参数的相关文章

JAVA基础_可变参数

自JAVA1.5以来,在JAVA中出现了可变参数一说,其针对的情况是对多个不确定的相同类型的元素进行同一类操作的情形. 可变参数有点类似与重载的概念,但是其中的可变参数是被隐式的转换成数组来进行处理的. 例如:对多个数进行求和,但是不知道具体有多少个这样的数. 使用条件: 可变参数必须是函数的最后一个变量,即在参数列表的最后 可变参数用 - 表示 调用可变参数的方法时,编译器会为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数 /** * 多个参数求和 * @author Admi

java可变参数列表的实现

参数就是我们调用一个方法时需要传入得数据,在方法中可能需要参数协助处理数据或者对参数进行解析处理以达到我们希望得到的数据和结果. 平常我们在写一个方法时,我们能确定需要传入什么样的参数以及参数的个数,这样我们在实现这个方法的时候在确定参数的时候都会有明确的目标.但是有时候会有这种特殊情况,我们并不知道我们将要传入几个参数,或者说我们并不确定外部会传入多少参数.在这种情况下,我们就要用到可变参数列表.下面是可变参数方法的实现方法. 1.传入数组对象或者集合,这里只对传入数组对象进行简单说明,集合的

java的不定参数,可变参数Object ...

对于java中不定参数,或者是可变参数Object ... 这是JDK1.5的新特性 针对不定参数的其他问题,可以参考Java不定长度参数[http://blog.chinaunix.net/uid-200142-id-3124427.html]

java 16 - 13 可变参数和Arrays工具类的asList()方法

可变参数:定义方法的时候不知道该定义多少个参数 格式: 修饰符 返回值类型 方法名(数据类型… 变量名){ } 注意: 这里的变量其实是一个数组 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个 1 import java.util.Scanner; 2 public class ArgsDemo { 3 4 public static void main(String[] args) { 5 int result = sum(1,2,3,4,5,6,7,8,9);//参与计

javaweb学习总结二(静态导入、自动拆装箱、增强for与可变参数)

一:静态导入语法:import static 导入类.成员变量|成员方法那么在代码中可以直接使用变量或者方法,而不需要通过类名.来调用 静态导入: 1 import static java.lang.System.out; 那么在代码中直接调用变量: 1 @Test 2 //测试静态导入 3 public void testStaticImport() { 4 out.println("static import..."); 5 } 二:装箱或者拆箱装箱:将基本数据类型赋值给引用数据类

宏与可变参数

对于打印函数printf我们太熟悉不过,但真是这样吗?看看其原型:     int printf( const char *format [, argument]... ); 等等,末尾的…是什么意思?省略号?是想留给读者无限的遐想空间?你大可这样认为,因为这是不固定参数,简称不定参数,换句话说,有多少参数都行,只要你敢想. 我们想看看可变参数如何使用,并且怎样实现可变参数.先看下面的例子: #include<stdio.h> #include<malloc.h> #include

java可变参数例子:求学生成绩信息,不确定课程数

可变参数特点: 1)...只能出现在参数列表的最后2)...位于变量类型和变量名之间3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数 //可变参数也可用数组来解决这个问题 package Test; public class Student { private int []score; //各科成绩 private int scoreCount=0; //总课程数 //构造函数 Student(int id,String name,int...is

可变参数省略号使用简介

C允许定义形参个数和类型不确定的函数.例如,C语言中的标准函数printf便使用这种机制.在声明不确定形参的函数时,形参部分可以使用省略号“…”代替.“…”告诉编译器,在函数调用时不检查形参类型是否与实参类型相同,也不检查参数个数. 如: [[email protected] exercise]# vi chang.c#include <stdio.h>int mult(int x , int y , const char * fmt , ...){ int result = x * y; i

[Java5新特性]可变参数

什么是可变参数 Java基础内容中,关于函数具有一种特性:重载,如果我们要完成多个数字想加的需求,可以按照以下代码完成: public class Demo { public int add(int a, int b) { return a + b; } public int add(int a, int b, int c) { return a + b + c; } public static void main(String[] args) { int sum1 = new Demo().a

可变参数列表的实现

在学习C语言的过程中,大家是不是和我一样,认为printf是一个神一样的函数?他可以接受不同数目,不同类型的参数,他到底是怎么实现的呢? 让我们去看一下它的源代码: printf源代码: int printf(const char *fmt,...) { int res; va_list arg; va_start(arg,fmt); res = vprintf(fmt,arg); va_end(arg); return res; } 它采用的是可变参数列表,可变参数列表主要有以下两个缺点: 1