Как одну строку в другую вставить //С++

SCIF32

Вроде раньше делал, теперь вспомнить не могу и найти.
строки char*.

kokoc88

Что значит вставить?

SCIF32

c1="Happy New Year!";
c2="Fucking ";
insert(c2,c1,10);// 10+-1
printf("%s\n",s1);
----------------------Имеем на выходе---------------------
Happy New Fucking Year!

kokoc88

Видимо, надо писать самому. Смотри strncpy strncat

Dasar



void insert(char * dest, char * source, const char * s, int index)
{
strncpy(dest, source, index);
strcpy(dest+index, s);
strcpy(dest+index+strlen(s source + index);
}
void main
{
c1="Happy New Year!";
c2="Fucking ";
char buffer[1000];
insert(buffer, c1,c2,10);
printf("%s\n",buffer);
}

ppplva

неэффективно s проходится два раза.
нет проверок на длину, опять же

evgen5555



char *result = calloc(strlen(s1) + strlen(s2) + 1, sizeof(char;
strncpy(result, s1, index);
strcat(result, s2);
strcat(result, s1 + index);


Так пойдет?

ppplva

Это еще медленнее


void insert(char* dest, char* src, char* s, int size, int index)
{
char *end = dest+size-1;
char* p;
char* q;
char* r;
for (p=dest,q=src; (*q) && (p<end); *p++=*q++);
for (r=s; (*r) && (p<end); *p++=*r++);
for (; (*q) && (p<end); *p++=*q++);
*p = '\0';
}

Dasar

А аргумент Index зачем?

sergey_m

void insert(char* dest, char* src, char* s, int size, int index)
О памяти заботится вызывающий?

evgen5555

О памяти заботится компилятор.

sergey_m

Короче, это достигается аллоцированием памяти (либо взятием буфера достаточного размера). Затем strncpy туда первой половины, и 2 раза strncat сначала вставляемую строку, потом вторую половину. На ОС способных к strlcat и strlcpy лучше использовать именно их.
Все остальное - от лукавого.

sergey_m

О памяти заботится компилятор.
Чооо?

ppplva

Да, под результат память выделяет вызывающий, size - ее размер.

kokoc88

Два раза strncat чтобы s в примере проходилась три раза. Это ещё вопрос, что от лукавого.

rosali

Смотри strncpy strncat

strncpy и strncat -- это не С++ а С, а в std::string есть навалом insert-ов


basic_string& insert(
size_type _P0,
const value_type* _Ptr
);
basic_string& insert(
size_type _P0,
const value_type* _Ptr,
size_type _Count
);
basic_string& insert(
size_type _P0,
const basic_string& _Str
);
basic_string& insert(
size_type _P0,
const basic_string& _Str,
size_type _Off,
size_type _Count
);
basic_string& insert(
size_type _P0,
size_type _Count,
value_type _Ch
);
iterator insert(
iterator _It,
value_type _Ch = value_type( )
);
template<class InputIterator>
void insert(
iterator _It,
InputIterator _First,
InputIterator _Last
);
void insert(
iterator _It,
size_type _Count,
value_type _Ch
);


На любой вкус.
#include <string> //без .h!

kokoc88

Надеюсь, ты в курсе, как долго компилируются проекты под stl. И насколько "легко" незнающему человеку в этом разобраться.

rosali

Причем тут это? Если человеку надо узнать как вставить одну C-строку (char *) в другую, пусть так и спрашивает, А если он написал //C++ значит хотел пользоваться std::string. По-моему так (С).

rosali

Или ты спрашиваешь, какой из них лучше подходит? Третий, наверное...


#include <string>
#include <iostream>
int main(int argc,char** argv) {
std::string c1 = "Happy New Year!";
std::string c2 = "Fucking ";
c1.insert(10,c2);
std::cout << c1;
}


Хотя и другие не хуже


std::string c1 = "Happy New Year!";
c1.insert(10, "Fucking ");


...

kokoc88

Да, я знаю как это выглядит. На таком маленьком примере всё просто. Если человек спрашивает про С++, то это ещё не значит, что ему нужен STL. Скорее всего, он начинающий. Не надо его пугать.

Dasar

в оригинальном сообщении написано char*

SCIF32

Да, на счет char -а справедливо замечено,
про STL я зняю, только вот со string ни когда не работал.
по этому не особо хотелось его юзать. Тем более ради одного раза вкомпиливать stl
(что повлечет за собой переписывание всех string-ов в проге ) не является мазой.
да и вообще вопрос был не совсем в этом --- вопрос был в том, что бы малой кровью (совсем совсем малой) сделать инсерт. Но пока все отвечали, я три раза успел забить на это (писать свой инсерт тоже ломало, так как там не только инсерт нужен).
ладно, всем спасибо, тему считать закрытой.

rosali

(что повлечет за собой переписывание всех string-ов в проге )


Я сам сейчас веду проект, написанный полностью на С другими людьми, со своими вставками на С++. У С++ вцелом и у STL в частности нормальная интегрируемость с С кодом...
Да, на счет char -а справедливо замечено

Sorry чего-то не заметил... Ну ничего, надеюсь моя лекция о высоких материях все равно пригодилась

SCIF32

суть в том, что если пользовать string, а не char*, то по-хорошему, его надо пользовать везде в коде,
а меня это ломало.
да и вообще -- меня все ломало.
ну а за ответы --- конечно, спасибо.

buka

sprintf =)
Оставить комментарий
Имя или ник:
Комментарий: