LINUX.ORG.RU

Конкатенация строк

 


2

2

Поскольку стандартные функции C убоги до невозможности — решил набыдлокодить свой велосипед для удобной конкатенации строк в количестве более двух:

char* str_concat(char *str_arr[])
	{
	char str[256] = "";
	for (int i=0; ; i++)
		{
		if (str_arr[i] == NULL) break;
		//printf("%s", str_arr[i]);
		strcat(str, str_arr[i]);
		}
	//printf("%s", str);
	char *out = (char*)malloc(sizeof(char)*(strlen(str)));
	strcpy(out, str);
	return out;
	}
Вызываю функцию примерно так:
char *arr[] = {"Строка1", "Строка2", …, "СтрокаN", NULL};
printf("%s\n", str_concat(arr));
Вопрос — как избавиться от фиксированного ограничения длины результирующей строки (char str[256])? Или есть варианты получше? На сишечке ничего сложнее хелловорлда не писал.

☆☆

Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от qulinxao

Ну сами посудите, что бы получить рез-т, который нужен ТСу, придется обернуть во что то вашу функу. Кроме того, что это не удобно, оно еще и добавит тормозов.

andreyu ★★★★★
()

ТС, если ты ТАКИМ образом бросаешь выделенную память вникуда, то лучше не пиши на Си.

printf("%s\n", str_concat(arr));
// а как теперь память освободить? T_T
kvap
()
Ответ на: комментарий от andreyu

1. доходчивость: запихали ; прочитали

#include<stdio.h>
char * str_concat(char * str_arr[]){
	char * p;
	size_t s;
	FILE * o = open_memstream(&p,&s);
	while(*str_arr){
		fprintf(o,"%s",*str_arr++);
	};
	fclose(o);
	return p;
}

int main(int a,char** b){
	printf("%s\n",str_concat(++b));//*s,..,*s,NULL
	return 0;
}

2. Производительность http://en.wikipedia.org/wiki/Rope_(data_structure)

3. замечательно когда существуют любители обмазываться памятью , а то и на асме писать (быстрее его нет ни чего ) «пузырёк»

qulinxao ★★☆
()
Ответ на: комментарий от andreyu

Конкатенация строк (комментарий) чтение из аргументов(для простоты теста совмещена с майном) и запись в выходной поток.

идея как была так и осталась -однократное чтение и выдача.

по первости пихнуть вышеизложеное в обёртку и вызывать как «подпроцесс» -

спасибо anonymous за упоминание open_mem_stream для более доходчего обьяснения.

qulinxao ★★☆
()
Последнее исправление: qulinxao (всего исправлений: 1)
Ответ на: комментарий от qulinxao

Производительность

для Ъ

Disadvantages:

    Greater overall space usage when not being operated on, mainly to store parent nodes. There is a trade-off between how much of the total memory is such overhead and how long pieces of data are being processed as strings; note that the strings in example figures above are unrealistically short for modern architectures. The overhead is always O(n), but the constant can be made arbitrarily small.
    Increase in time to manage the extra storage
    Increased complexity of source code; greater risk for bugs

сам-то читал?

3. замечательно когда существуют любители обмазываться памятью

типа тебя?

а то и на асме писать (быстрее его нет ни чего ) «пузырёк»

ты ради прикола напиши пузырёк на асме, потом расскажешь ощущения.

drBatty ★★
()
Ответ на: комментарий от qulinxao

если на асме писать сорт - то проще пирамиду.

как хочешь. Пиши пирамиду. Хоть что-то. Только никому не показывай.

drBatty ★★
()
Ответ на: комментарий от drBatty

там много чё не хватает - «балансинга» для защиты от «плохих» редактирующих последовательностей ....

rope во втором пункте указаны как пример , что если озадачиваться плясками со строками как последовательностями символов , то решения есть более проблемноориентированные , чем обращение с последовательностями не нулевых байт.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Спасибо, пожалуй использую эту реализацию.

wintrolls ☆☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.