как напечатать переменное количество аргументов? (АНСИ С)

Я пытаюсь сравнить биты переменного количества аргументов и вывести их значение. но я получаю мусор. Что я делаю не так?

Мой код:

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

void and_bits(unsigned int num, ...)
{
unsigned int i = 0;
/* result is 11111111 in binary*/
unsigned int result = 255;

va_list arglist;
va_start(arglist, num);

/* this loop takes each argument, and apply AND bitwise operator to the next argument*/
for (i = 0; i < num; i++)
{
    
    /* bitwise AND operator */
    result &= va_arg(arglist,unsigned int);
    printf("%u, ",va_arg(arglist,unsigned int));
}
va_end(arglist);
printf("\nthe return value: base 10 = %u\t", result);
printf("base 16 = %x\n", result);
return;
}

int main(void)
{
and_bits(7,2,3);
return 0;
}

Выход:

      3, 0, 0, 1987831328, 0, 3742925664, 3742924928,
the return value: base 10 = 0   base 16 = 0

1 ответ

Итак, у вас есть две проблемы. Первый прикрывается комментариями, но по сути вы не звоните and_bitsправильный. Первым аргументом должен быть счетчик.

Но у вас есть большая проблема, прямо здесь:

      for (i = 0; i < num; i++)
{
    
    /* bitwise AND operator */
    result &= va_arg(arglist,unsigned int);
    printf("%u, ",va_arg(arglist,unsigned int));
}

Каждый раз, когда вы вызываете , вы перемещаете указатель аргумента на единицу. Итак, если вы позвонили and_bits(3, 7, 2, 3), то на первой итерации цикла:

  1. Вы вызываете , который возвращает значение 7, и вы устанавливаете результат в result & 7.

  2. Затем в следующей строке вы вызываете , которая возвращает 2, поэтому вы распечатываете это.

Затем в следующей итерации цикла:

  1. Вы звоните, который возвращает 3, и установите результат в result & 3.

  2. Вы вызываете снова, но вы уже использовали три аргумента, поэтому теперь вы читаете дальше списка аргументов и получаете неопределенные результаты.

Вы собираетесь пройти цикл еще раз, и в этот момент все возвращаемые значения будут недействительными.

Вы должны изменить цикл так, чтобы он вызывал только va_arg()однажды:

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

void and_bits(unsigned int num, ...)
{
unsigned int i = 0;
/* result is 11111111 in binary*/
unsigned int result = 255;

va_list arglist;
va_start(arglist, num);

/* this loop takes each argument, and apply AND bitwise operator to the next argument*/
for (i = 0; i < num; i++)
{
    
    /* bitwise AND operator */
    unsigned int val = va_arg(arglist,unsigned int);
    result &= val;
    printf("%u: val=%u, result=%u\n", i, val, result);
}
va_end(arglist);
printf("\nthe return value: base 10 = %u\t", result);
printf("base 16 = %x\n", result);
return;
}

int main(void)
{
and_bits(3, 7,2,3);
return 0;
}

Что производит в качестве вывода:

      0: val=7, result=7
1: val=2, result=2
2: val=3, result=2

the return value: base 10 = 2   base 16 = 2
Другие вопросы по тегам