当前位置:编程学习 > C/C++ >>

C语言 可变参数列表

就是<stdarg.h>这个头文件里面的可变参数列表,不是很会用,编出来的程序总是错的,谁能给我讲讲那几个参数的用法? 这个东西用的地方多吗?

求几个数字的最大的一个,还是不对。。。。。

#include<stdio.h>
#include<stdarg.h>
float max_list(float number,...) ;
void main()
{
    float a,b,c,d;
    a = 3;
    b = 4;
    c = 5;
    d = 6;
    printf("%f",max_list(4,a,b,c,d));
    getch();
}
float max_list(float number,...)
{
    va_list var_arg;
    int count;
    float consequence = 0;
    float m ;

    va_start(var_arg,number);
   /* for(count = 0 ; count < number;count+=1)
    {

        if((m=va_arg(var_arg,float))>=consequence)
            consequence = m;

    */
    while((m=va_arg(var_arg,float))>=0)
    {
      if(m>consequence)
        consequence = m;
       
    }
    va_end(var_arg)
    return  consequence  ;
}

追问:懂了,实验也成功了,先谢谢,能再问一下吗?为什么这里存在精度的问题?

答案:#include <stdio.h>
#include <stdarg.h>

float max_list(int number...);

void main() {
    float a = 3,b = 4,c = 5,d = 6;
    printf("max = %.2lf\n\n",max_list(4,a,b,c,d));
    getch();
}

float max_list(int number ...) {
    va_list ap;
 double num,consequence = 0;

 va_start(ap,number); // 读出第一个数,并移动指针指向下一个数
 printf("number = %d\n",number);
    while(number--) {
  num = va_arg(ap,double); // 浮点数全部用双精度类型读入,单精度读出的结果有误
  printf("%8.2lf",num);
  if(num > consequence) consequence = num;
    }
 printf("\n");
    va_end(ap); // 将参数指针赋空值
    return (float)consequence;
}

VC++ 6.0环境下调试、运行结果

下面的是我之前写的一个这个类型的使用例子。这个一般都是用来格式化字符串的。你可以先看下。
注意里面加粗了的那行注释!!
最后其实是把不确定的参数格式化后存储到了一个字符串数组中。
也就是,不管你输入的参数是什么,最后都变成了字符串了!!
你可以从字符串中提取出有用的信息再进行处理。

/***************************源文件说明性注释: 开始******************************
** Copyrigth (c) 2011,
** All rights reserved
**
** 文 件 名 : main.c
** 创建日期 : 2010-9-8  15:00:31
** 内容概述 : vsprintf函数使用演示
**
** 原始版本 : v1.0.0
** 作    者 :
** 完成日期 :
**
** 当前版本 :
** 作    者 :
** 完成日期 :
** 备    注 :
****************************源文件说明性注释: 结束*****************************/


/*********************************#include*************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>



/*********************************#define**************************************/



/******************************函数定义注释头***********************************
** 函数名         : void    Print(char* format, ...)
** 函数功能       : 打印输出指定格式的字符串
** 全局变量和结构 :
** 调用的主要函数 :
** 返回值说明     :
** 参数表         :
*******************************函数体定义**************************************/
void    Print(char* format, ...)
{
    va_list     list;
    char        str[256];               // 字符串缓冲区,用来存储格式化后的字符串

    va_start(list, format);             //

    vsprintf(str, format, list);        // 对函数参数进行格式化,并将格式化后的结果存储到str缓冲区中

    printf("%s", str);                  // 打印输出格式化后的字符串

    va_end(list);                       //
}


/*******************************全局变量定义区*********************************/



/********************************函数体定义区**********************************/





/******************************函数定义注释头***********************************
** 函数名         : void main(void)
** 函数功能       :
** 全局变量和结构 :
** 调用的主要函数 :
** 返回值说明     :
** 参数表         :
*******************************函数体定义**************************************/
void main(void)
{
    int     a = 3;
    float   f = 1.2f;
    double  d = -3.3;
    char*   s = "String";

    Print("%d %0.1f\t%0.3f %s\n",a, f, d, s);
}


/*********************************源文件结束***********************************/




while((m=va_arg(var_arg,double))>0)

#include<stdio.h>
#include<stdarg.h>
#include <conio.h>
float max_list(float number,...) ;
void main()
{
    float a,b,c,d;
    a = 3;
    b = 4;
    c = 5;
    d = 6;
    printf("%f",max_list(4,a,b,c,d));
    getch();
}
float max_list(float number,...)
{
    va_list var_arg;
 //   float count;
    float consequence = 0;
    float m ;

    va_start(var_arg,number);
   /* for(count = 0 ; count < number;count+=1)
    {

        if((m=va_arg(var_arg,float))>=consequence)
            consequence = m;

    */
    while(number--)
    {
  m=va_arg(var_arg,double);
      if(m>consequence)
        consequence = m;
       
    }
    va_end(var_arg);
    return  consequence  ;
}

float需要提升为double

上一个:用C语言编写程序
下一个:C语言的一个链表问题

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,