Конкатенация (сложение) строк - C (СИ)
Формулировка задачи:
Необходимо составить функцию выполняющую конкатенацию произвольного количества строк:
Здесь s – указатель на массив соединяемых строк, n – количество строк в массиве.
Функция должна создавать в динамической памяти новую строку, размер которой равен суммарному размеру всех соединяемых строк, записывать в неё соединяемые строки друг за другом в том порядке, в котором они перечислены в массиве, и возвращать указатель на новую строку.
Программа concat.c должна считывать количество строк и сами соединяемые строки и выводить результирующую строку.
Пример входных данных программы:
4
One,
two,
three,
and four
Для этих данных программа должна выводить в стандартный поток вывода строку
One,two,three,and four
Подскажите, как это можно сделать? В Си я новичок и поэтому даже не знаю с чего начать. Заранее спасибо)
char *concat(char **s, int n)
{
...
}Решение задачи: «Конкатенация (сложение) строк»
textual
Листинг программы
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *concat(char **s, int n) {
int length = 0;
for(int i = 0; i < n; i++)
length += strlen(s[i]);
length++;
char *string = (char *)malloc(length);
strcpy(string, "");
for(int i = 0; i < n; i++) {
strcat(string, s[i]);
}
return string;
}
int main() {
char *string[5];
//allocate memory
for(int i = 0; i < 5; i++)
string[i] = (char *)malloc(50);
//enter strings
for(int i = 0; i < 5; i++)
gets(string[i]);
char *temporary_string = concat(string, 5);
puts(temporary_string);
//free memory
for(int i = 0; i < 5; i++)
free(string[i]);
free(temporary_string);
system("pause");
return 0;
}
Объяснение кода листинга программы
- В функции
mainсоздается массив указателей на строкиstringразмером 5. - В цикле
forкаждому элементу массиваstringвыделяется память с помощьюmallocи присваивается адрес с помощью&. - В цикле
forкаждому элементу массиваstringсчитывается строка с помощьюgets. - В функции
concatсоздается указатель на первую строкуs[0]. - В цикле
forначиная с 0 и доnвключительно, происходит суммирование длин строк с помощью функцииstrlenи сохранение результата в переменнойlength. - К значению переменной
lengthдобавляется единица, чтобы учесть нулевой символ в итоговой строке. - С помощью
mallocвыделяется память под итоговую строку с учетом нулевого символа и с помощьюstrcpyв эту память копируется пустая строка. - В цикле
forначиная с 0 и доnвключительно, происходит добавление каждой строки к итоговой строке с помощью функцииstrcat. - Функция
concatвозвращает указатель на итоговую строку. - В функции
mainсоздается временная строкаtemporary_stringс помощьюconcat, указывая массивstringи количество строк в нем. - С помощью
putsвременная строка выводится на экран. - В цикле
forначиная с 0 и до 5 включительно, происходит освобождение памяти, выделенной под каждый элемент массиваstring, с помощьюfree. - Память, выделенная под временную строку, также освобождается с помощью
free. - Команда
system(pause)приостанавливает выполнение программы до нажатия клавиши. - Функция
mainвозвращает 0, что означает успешное выполнение программы.