Вставить строку в другую строку эффективно - PullRequest
2 голосов
/ 22 ноября 2010

у меня

char aa[] = { "Hello, !" };

char bb[] = { "World" };

Как наиболее эффективно вставить bb в aa с помощью cstring?

Ответы [ 4 ]

10 голосов
/ 22 ноября 2010
  • выделить достаточно большой буфер (malloc / new[])
  • скопировать первую часть строки aa в буфер (strncpy / memcpy)
  • скопировать строку bb (strcpy / memcpy)
  • скопировать оставшуюся часть строки (strncpy / memcpy)
7 голосов
/ 22 ноября 2010

Максимальная оптимизация обычно требует использования определенных требований.Вы делаете код менее общим, чтобы набрать скорость (или какую-то другую метрику).Возможно, вы знаете какой-то угол, который вы можете вырезать, но мы должны догадаться.

Фрагменты кода ниже используют следующие заголовки:

#include <stdio.h>
#include <string.h>

Если вы хотите максимизировать производительность, это поможетвыделите достаточно места для последней строки, после вставки:

#define MAX_STR_LEN 256 

char aa[MAX_STR_LEN] = "Hello, !";
char bb[] = "World";

Вы не указываете, откуда вы знаете, куда вставить.Для моего примера кода я определяю точку вставки как смещение в строке назначения:

size_t pos = 7;

Если вы заранее знаете одну из длин строки, вы должны использовать const вместо вызова strlen, который должен сканироватьстрока.Здесь я не думаю, что вам повезло.

size_t srclen = strlen(bb);

Функция memmove правильно обрабатывает перекрывающиеся источники и назначения:

//  +1 for count to include terminating null
memmove(aa+pos+srclen, aa+pos, strlen(aa)-pos+1);

memcpy быстрее в некоторыхплатформы и могут быть безопасно использованы для копирования между строками:

memcpy(aa+pos, bb, srclen);

Теперь aa содержит результат.

Если вы не можете предварительно выделить aa до требуемого размера,затем:

// additional include for malloc
#include <stdlib.h>

char aa[] = "Hello, !";
char bb[] = "World";
size_t pos = 7;    

size_t srclen = strlen(bb);
size_t dstlen = strlen(aa);
char *m = malloc(srclen+dstlen+1);
// Test for NULL or use an allocator that throws

memcpy(m, aa, pos);
memcpy(m+pos, bb, srclen);
memcpy(m+pos+srclen, aa+pos, dstlen-pos+1);

m содержит результат и, вероятно, в конечном итоге должно быть free 'd.

Запомните, есть ли вероятность переполнения буфера, вы должны проверить длинучтобы избежать повреждения памяти и возможной уязвимости безопасности.

Надеюсь, это поможет.

3 голосов
/ 22 ноября 2010
std::string aa = "Hello, !";
std::string bb = "World";
aa.insert(7, bb);

не хочу использовать строку из C ++

Тогда почему вы помечаете это как C ++?

0 голосов
/ 17 сентября 2013

char * newStr = malloc (strlen (aa) + strlen (bb));

sprintf (newStr, "% s% s", aa, bb);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...