Простая Функция С Переменным Количеством Аргументов В C Ошибка Параметров
У меня есть очень простой код. Этот код работает на Linux машине. Но когда я строю с перекрестной компиляцией и запускаю на встроенном аппаратном параметре, значения вариадических функций неверны. Речь идет о компиляции (кросс-компиляции)? Все запущенный приложения функционируют нормально, но с переменным числом аргументов не работает.
Мой пример кода ниже. Оба из foo и formatString функции работают неправильно.
void foo(char *fmt, ...)
{
va_list ap;
int d;
char c, *s;
va_start(ap, fmt);
while (*fmt)
{
switch (*fmt++)
{
case 's' :
s = va_arg(ap, char *);
printf("string %sn", s);
break;
case 'd' :
d = va_arg(ap, int);
printf("int %dn", d);
break;
case 'c':
c = (char) va_arg(ap, int);
printf("char %cn", c);
break;
}
va_end(ap);
}
void formatString(char* format, ...)
{
va_list args;
char buffer[100];
va_start(args, format);
sprintf(buffer, format, args);
va_end(args);
printf((char*)buffer);
}
int main(int argc, char **argv)
{
printf("nProgram Started");
foo("MSG : %d", 10);
formatString("MSG : %d", 10);
return 0;
}
2 ответа:
Ваш вызов
sprintf
неверен. Если вы хотите передатьva_list
вsprintf
, вы должны использовать функциюvsprintf
.Кроме того, чтобы быть немного безопаснее, рассмотрите возможность использования
snprintf
(vsnprintf
в данном случае) вместоsprintf
.
Ваша функция formatString неверна:
void formatString(char* format, ...) { va_list args; char buffer[100]; va_start(args, format); vsprintf(buffer, format, args); va_end(args); printf("%s\n", (char*)buffer); }
Вы также должны рассмотреть vsnprintf, но я предполагаю, что это только для целей тестирования.