【问题标题】:variable argument function可变参数函数
【发布时间】:2011-07-08 19:44:06
【问题描述】:

在做与可变参数函数 i 相关的程序时

得到头文件stdarg.h并用它做了一些简单的问题

但是现在当我改变实际参数的类型时,它会表现出一些奇怪的行为

这是我的代码:

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

void fun(int a,...)
{
va_list k;

va_start(k,a);
int i=0;
printf("%d  ",a);
while((i=va_arg(k,int)!=0)
{
printf("  %d  ",i);
}
va_end(k);
}

int main()
{
fun(1,2,3,4,5,6);
printf("\n");
fflush();  //and without flush it is also showing some extra garbage value
fun(2,4,5);

printf("\n");
fflush();
fun('c','f','g','l');
return 0;
}

【问题讨论】:

  • 请向我们展示您的包含:每行缩进 4 个空格
  • 这如何编译fflush 需要一个流参数,例如fflush(stdout)。即使你可以编译它(你只是忽略编译器警告???)那么你可能会在运行时得到一些讨厌的行为。
  • 是的,它正在发出警告,但它正在运行 b/c 没有错误,正如我已经提到的,如果 ia m 不包括 fflush 那么它也会为 int 提供额外的垃圾值..thanx ..

标签: variables arguments


【解决方案1】:

如果你使用整数值 0 来表示参数列表的结束,你也应该传递一个 0 给 fun。

fun(1,2,3,4,5,6,0);
fun(2,4,5,0);

【讨论】:

    【解决方案2】:

    首先,以 0 结束您的列表,因为您检查 !=0 来检测结尾。还有:

    while((i=va_arg(k,int))!=0)
    

    而不是

    while(i=va_arg(k,int)!=0)
    

    != 的优先级高于 =

    这将为您提供预期的输出:

    1 2 3 4 5 6

    这是完整的代码:

        #include<stdio.h>
        #include<stdarg.h>
    
        void fun(int a,...)
        {
        va_list k;
    
        va_start(k,a);
        int i=0;
        printf("%d  ",a);
        while((i=va_arg(k,int))!=0)
        {
        printf("  %d  ",i);
        }
        va_end(k);
        }
    
        int main()
        {
        fun(1,2,3,4,5,6,0);
        printf("\n");
    
        //fun(2,4,5,0);
    
        printf("\n");
    
        //fun('c','f','g','l','\0');
    
        getch();
        return 0;
        }
    

    【讨论】:

    • 实际上我以前的代码对于整数是正确的,但问题是它为字符显示了额外的垃圾值,前面代码的输出是 1 2 3 4 5 6 2 4 5 99 102 103 108 213851632 10 请看 ..thanx.
    • 我显然确实看到了您的代码,因为我修改了它。您可以通过在参数列表的末尾添加一个 0 值来避免多余的字符(毕竟 while((i=va_arg(k,int))!=0) 检查该空终止符)。如果你不相信我:试试我的代码 :-)
    • 得到了答案,只是在字符参数列表中添加了 0 ...thanx to all
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多