функция переменного аргумента - PullRequest
1 голос
/ 04 марта 2011

во время выполнения программы, связанной с функцией переменного аргумента, я

получил заголовочный файл stdarg.h и выполнил несколько простых задач, используя его

, но теперь, когда ia изменяет тип фактического аргумента, онпоказывает странное поведение

вот мой код:

#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;
}

Ответы [ 2 ]

0 голосов
/ 04 марта 2011

Сначала завершите ваш список 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;
    }
0 голосов
/ 04 марта 2011

Если вы используете целочисленное значение 0 для обозначения конца списка аргументов, вы также должны передать 0 в fun.

fun(1,2,3,4,5,6,0);
fun(2,4,5,0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...