Как одну строку в другую вставить //С++
Что значит вставить?
c1="Happy New Year!";
c2="Fucking ";
insert(c2,c1,10);// 10+-1
printf("%s\n",s1);
----------------------Имеем на выходе---------------------
Happy New Fucking Year!
c2="Fucking ";
insert(c2,c1,10);// 10+-1
printf("%s\n",s1);
----------------------Имеем на выходе---------------------
Happy New Fucking Year!
Видимо, надо писать самому. Смотри strncpy strncat
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);
}
неэффективно
s проходится два раза.
нет проверок на длину, опять же
s проходится два раза.нет проверок на длину, опять же

char *result = calloc(strlen(s1) + strlen(s2) + 1, sizeof(char;
strncpy(result, s1, index);
strcat(result, s2);
strcat(result, s1 + index);
Так пойдет?

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

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';
}
А аргумент Index зачем?
void insert(char* dest, char* src, char* s, int size, int index)О памяти заботится вызывающий?
О памяти заботится компилятор.
Короче, это достигается аллоцированием памяти (либо взятием буфера достаточного размера). Затем strncpy туда первой половины, и 2 раза strncat сначала вставляемую строку, потом вторую половину. На ОС способных к strlcat и strlcpy лучше использовать именно их.
Все остальное - от лукавого.
Все остальное - от лукавого.
О памяти заботится компилятор.Чооо?
Да, под результат память выделяет вызывающий, size - ее размер.
Два раза strncat чтобы s в примере проходилась три раза. Это ещё вопрос, что от лукавого. 

Смотри 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!
Надеюсь, ты в курсе, как долго компилируются проекты под stl. И насколько "легко" незнающему человеку в этом разобраться.
Причем тут это? Если человеку надо узнать как вставить одну C-строку (char *) в другую, пусть так и спрашивает, А если он написал //C++ значит хотел пользоваться std::string. По-моему так (С).
Или ты спрашиваешь, какой из них лучше подходит? Третий, наверное...
Хотя и другие не хуже
...
#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 ");
...
Да, я знаю как это выглядит. На таком маленьком примере всё просто.
Если человек спрашивает про С++, то это ещё не значит, что ему нужен STL. Скорее всего, он начинающий. Не надо его пугать. 
Если человек спрашивает про С++, то это ещё не значит, что ему нужен STL. Скорее всего, он начинающий. Не надо его пугать. 
в оригинальном сообщении написано char*
Да, на счет char -а справедливо замечено,
про STL я зняю, только вот со string ни когда не работал.
по этому не особо хотелось его юзать. Тем более ради одного раза вкомпиливать stl
(что повлечет за собой переписывание всех string-ов в проге
) не является мазой.
да и вообще вопрос был не совсем в этом
--- вопрос был в том, что бы малой кровью (совсем совсем малой) сделать инсерт. Но пока все отвечали, я три раза успел забить на это (писать свой инсерт тоже ломало, так как там не только инсерт нужен).
ладно, всем спасибо, тему считать закрытой.
про STL я зняю, только вот со string ни когда не работал.

по этому не особо хотелось его юзать. Тем более ради одного раза вкомпиливать stl
(что повлечет за собой переписывание всех string-ов в проге
) не является мазой.да и вообще вопрос был не совсем в этом
--- вопрос был в том, что бы малой кровью (совсем совсем малой) сделать инсерт. Но пока все отвечали, я три раза успел забить на это (писать свой инсерт тоже ломало, так как там не только инсерт нужен).ладно, всем спасибо, тему считать закрытой.
(что повлечет за собой переписывание всех string-ов в проге )
Я сам сейчас веду проект, написанный полностью на С другими людьми, со своими вставками на С++. У С++ вцелом и у STL в частности нормальная интегрируемость с С кодом...
Да, на счет char -а справедливо замечено
Sorry
чего-то не заметил... Ну ничего, надеюсь моя лекция о высоких материях все равно пригодилась 
суть в том, что если пользовать string, а не char*, то по-хорошему, его надо пользовать везде в коде,
а меня это ломало.
да и вообще -- меня все ломало.
ну а за ответы --- конечно, спасибо.
а меня это ломало.
да и вообще -- меня все ломало.
ну а за ответы --- конечно, спасибо.
sprintf =)
Оставить комментарий
SCIF32
Вроде раньше делал, теперь вспомнить не могу и найти.строки char*.