Переменных аргументов в C


Я пишу метод, который принимает число n и n ints (переменное число), и эта функция вернет сумму ints, не включая n. я застрял на том, как получить доступ к каждому параматеру индивидуально. Вот что у меня есть до сих пор, я читал об этом в интернете и надеюсь, что я на правильном пути. метод, который кажется полезным найти в сети:

va_start()
va_arg()
va_end()


int sumv(int n, ...)
{
  va_list list;
  int sum = 0;
  while(n>0)
  {
    //*********************
    //this is the part where I am stuck on, how do I get each paramater?
    //I know it will be an int
    //*********************
    n--;
  }
  return sum;
}
2 2

2 ответа:

Это должно выглядеть примерно так:

int sumv(int n, ...)
{
  va_list list;
  va_start(list, n);
  int sum = 0;
  while(n>0)
  {
    sum += va_arg(list, int);
    n--;
  }
  va_end(list);
  return sum;
}

Вы в основном ищете это:

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

int sumv (int n, ...) {
    va_list list;

    int sum = 0;

    va_start (list, n);
    while (n-- > 0)
        sum += va_arg (list, int);
    va_end (list);

    return sum;
}

int main (void) {
    printf ("%d\n", sumv (5, 1, 2, 3, 4, 5));
    return 0;
}
Это выводит сумму первых пяти натуральных чисел, 15.

Основная идея заключается в том, чтобы va_start, давая как Список для использования, так и конечный аргумент в функции перед началом аргументов переменной.

Затем каждый вызов va_arg дает вам следующий аргумент указанного типа (int здесь). Этот конкретный код вызывает его на основе вашего счетчика, но вы также можете использовать значение sentinel в конце, например отрицательное число, при условии, что отрицательные числа недопустимы в аргументах.

Затем, после обработки всех аргументов, используйте va_end для завершения обработки.