2015-12-22 3 views
0

Рассмотрим следующий код:Как решить эту проблему, связанную с переменными аргументами в C, используя библиотеку stdard.h?

#include<stdio.h> 
#include<stdarg.h> 
int sum(int, ...); 
int main() 
{ 
    int a; 
    a=sum(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
    printf("the sum is %d", a); 
    return 0; 
} 

int sum(int a, ...) 
{ 
    int s=0, i=1; 
    va_list ls; 
    va_start(ls, a); 

    while(i<=a) 
    { 
     s=s+va_arg(ls, int); 
     i++; 
    } 
    va_end(ls); 
    return s; 
} 

Приведенный выше код вычисляет сумму первых 10 натуральных чисел, используя переменные аргументы, с помощью функции суммы. a первый аргумент суммы, указано, что пользователь дает 10 натуральных чисел, сумма которых необходима, но я хочу, чтобы мы могли найти сумму, не указав количество чисел, которые я собираюсь добавить. I означает

sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 

рассчитает сумму первых 10 натуральных чисел, который составляет 55. Пожалуйста, найти способ и скажите мне

+0

И почему я должен сказать вам? Что вы искали? –

+0

Сначала прочитайте страницу [Спросить]. –

+2

Там * * не может получить количество аргументов для функции с переменными аргументами. Вам необходимо указать количество аргументов (например, вы делаете), использовать, например, строку форматирования (например, 'printf' и' scanf') или использовать специальное значение терминатора. –

ответ

1

Ваш пример не является хорошим примером использования аргументов переменным числом. Вы покупаете гибкость суммирования произвольного количества значений за счет безопасности типа. Ваш код также должен опираться либо на указание количества аргументов, либо на предоставление контрольного значения. (Есть методы проверки таких вещей в статическом анализе, но они зависят от компилятора.)

Но когда вам нужно суммировать произвольные списки значений в C? В C данные организованы в массивы. Таким образом, C способ сделать то, что вы хотите:

int array_sum(int a[], size_t n) 
{ 
    int sum = 0; 

    while (n--) sum += a[n];   
    return sum; 
} 

Если вы хотите, вы можете превратить это в VARIADIC функции с VARIADIC макрос, который использует C99 составные литералы и тому countof макрос, который определяет размер массив:

#define SUM(...) array_sum((int[]){__VA_ARGS__}, \ 
    sizeof((int[]){__VA_ARGS__})/sizeof((int[]){__VA_ARGS__}[0])) 

Теперь вы можете использовать как массивы и VARIADIC списки:

int a[] = {1, 2, 3, 4, 5, 6}; 

printf("%d\n", array_sum(a, 6)); 
printf("%d\n", SUM(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); 
printf("%d\n", SUM(0xff, 1ull, 0.0)); 

Обратите внимание, как нецелые преобразуются в целые числа со знаком, прежде чем суммированием с обычными правилами. В этом случае подход <stdarg.h> не будет работать, потому что функция полагается на все параметры, равные ints, но у этого нет никаких средств для обеспечения этого.