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