Создание функции, формирующую предложение из аргументов функции, аргументы . Аргументы - переменное число - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Короче, вот бы всё норм. Хочу соединять, но он мне выдаёт ошибку, когда использую strcat. Не могу понять, с типами аргументов вроде проблем нет( там символьный указатель, здесь символьный указатель), но когда ставлю что - нибудь из своего динамического массива, всё сразу летит. Вот код:
char *sentence( int CountArg, ...)
{
    int i;
    char **word = (char**)malloc(sizeof(char)*CountArg);
    char *s;
    for ( i = 0; i < CountArg; i++)
    word[i] = (char*)malloc(sizeof(char)*N);
    va_list arglist;
    va_start( arglist, CountArg );
    for ( i = 0; i < CountArg; i++)
    word[i] = va_arg( arglist, char*);
    va_end(arglist);
    i = 0;
    s = word[i];
 
    return s;
}

Решение задачи: «Создание функции, формирующую предложение из аргументов функции, аргументы . Аргументы - переменное число»

textual
Листинг программы
char *sentence( int CountArg, ...)
{
    int i;
    char **word = (char**)malloc(sizeof(char)*CountArg);
    char *s;
    for ( i = 0; i < CountArg; i++)
    word[i] = (char*)malloc(sizeof(char)*N);
    va_list arglist;
    va_start( arglist, CountArg );
    for ( i = 0; i < CountArg; i++)
    word[i] = va_arg( arglist, char*);
    va_end(arglist);
    i = 0;
    s = word[i];
    for( i = 1; i < CountArg; i++)
      {  
        strcat(s, " ");
        strcat(s, word[i]);
}
    return s;
}

Объяснение кода листинга программы

В данном коде реализована функция sentence, которая принимает целочисленный аргумент CountArg и переменное количество аргументов.

  1. Сначала объявляются необходимые переменные:
    • i - используется для обхода массива аргументов;
    • word - динамический массив указателей на строки;
    • s - указатель на строку, в которую будут конкатенироваться аргументы;
    • N - размер памяти, выделенной под каждый аргумент.
  2. Затем происходит выделение памяти под массив указателей на строки: word = (char*)malloc(sizeof(char)CountArg);
  3. После чего, в цикле происходит выделение памяти под каждый аргумент: for ( i = 0; i < CountArg; i++) word[i] = (char)malloc(sizeof(char)N);
  4. Инициализируется переменная arglist для работы с вариативными аргументами: va_start(arglist, CountArg);
  5. В цикле происходит получение каждого аргумента: for ( i = 0; i < CountArg; i++) word[i] = va_arg(arglist, char*);
  6. После обработки всех аргументов, освобождается память, выделенная под arglist: va_end(arglist);
  7. Устанавливается начальное значение i = 0 и s = word[i];
  8. В цикле, начиная со второго аргумента, происходит добавление каждого аргумента к строке s: for( i = 1; i < CountArg; i++) strcat(s, ); strcat(s, word[i]);
  9. В конце функции возвращается полученная строка s.
  10. Функция может быть вызвана следующим образом: char *str = sentence(3, first, second, third); Вывод: first second third

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5
Похожие ответы