как напечатать переменное количество аргументов? (АНСИ С)
Я пытаюсь сравнить биты переменного количества аргументов и вывести их значение. но я получаю мусор. Что я делаю не так?
Мой код:
#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)
, то на первой итерации цикла:
Вы вызываете , который возвращает значение
7
, и вы устанавливаете результат вresult & 7
.Затем в следующей строке вы вызываете , которая возвращает 2, поэтому вы распечатываете это.
Затем в следующей итерации цикла:
Вы звоните, который возвращает
3
, и установите результат вresult & 3
.Вы вызываете снова, но вы уже использовали три аргумента, поэтому теперь вы читаете дальше списка аргументов и получаете неопределенные результаты.
Вы собираетесь пройти цикл еще раз, и в этот момент все возвращаемые значения будут недействительными.
Вы должны изменить цикл так, чтобы он вызывал только
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