2017-01-28 2 views
1

Я пытаюсь создать функцию, которая может принимать любое количество аргументов типов char, char * и int после первых двух аргументов. Но мне не удается заставить его принимать значения, отличные от char *. Вот что у меня есть:Как передать N аргументов разных типов в C

int formatter (char *str, const char *format, ...) { 
    va_list valist; 
    va_start(valist, format); 
    int i; 
    for (i = 0; i < strlen(format); i++) { 
     switch (format[i]) { 
      case '1': 
       strcat(str, va_arg(valist, char*)); 
     } 
    } 

    va_end(valist); 
    return 1; 
} 

Вызов, который вызывает программу аварии:

int leet = 1337; 
char temp[10] = "Hello!"; 
char result[100] = ""; 
formatter(result, "1 My name is 1", temp, leet); 
+0

Что такое «проблема»? Вы получаете сообщение об ошибке? – DyZ

+0

.exe просто перестает работать – Ulsting

+0

Под «остановками» вы имеете в виду «успешно завершает» или «сбой»? Какова ценность 'format'? – DyZ

ответ

5

При использовании VARIADIC аргументов (в C), не существует прямой путь внутри функции, чтобы знать, что аргументы, которые вам даны. Обычным обходным путем является то, что один из параметров (в вашем случае, как и во многих других, параметр format) используется для определения типов дополнительных параметров.

Каждый раз, когда вы вызываете va_arg, вы должны указать, что является типом следующего параметра. Это не только для ввода, но также и потому, что размер параметра требуется для обновления указателей «за кадром».

Если вы modifiy ваш цикл таким образом:

switch (format[i]) { 
    case '1': 
     doSomethingWithAString(va_arg(valist, char*)); 
     break; 
    case '2': 
     doSomethingWithAInt(va_arg(valist, int)); 
     break; 
} 

Тогда при вызове функции, вы будете иметь возможность использовать параметр формата сказать, какие параметры являются строка, и какие из них являются ИНТ , Например:

formatter(str, "12221", str1, i1, i2, i3, str2); 

С вашим примером, вы передаете целое число, когда ваша строка формата говорит форматировщик должен ожидать строку. Отсюда крушение.

+1

@DYZ: Неверно. Он передает 1337 в качестве параметра. –

+0

@melpomene ok, я вижу. – DyZ

+0

Сначала я попытался это сделать, однако при компиляции я получаю предупреждение о том, что программа будет прервана при достижении этих строк. 'warning: 'char' повышается до 'int' при передаче через '...' [включено по умолчанию ] ' ' strcat (str, va_arg (valist, chat)); ' – Ulsting

Смежные вопросы