Необходимо вставить строку в другую строку, но после определенного символа. Без использования String и других библиотек
string str = "Rasim, Hello!";
size_t pos = str.find_first_of(',');
str.insert(pos + 1, " Misar and Kefal");
cout << str << endl;
Пусть у вас есть строка str
. Затем, чтобы что-то вставить в неё, вам нужно знать позицию внутри строки. .find_first_of
возвращает индекс вашего определённого символа. После него вставим новую строку: str.insert(pos + 1, "Misar and Kefal");
Без std::string и т.п. можно так
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *
insert (char *str, size_t capacity, char *subs, char c, int *uerr)
{
int dummy, *err = uerr ? uerr : &dummy;
*err = 0;
char *p = c ? strchr(str, c) : str - 1;
if (p) {
p++;
size_t l2 = strlen(subs);
if (l2) {
size_t l1 = strlen(str);
if (l1 + l2 > capacity)
return (*err = 1, (char *)0);
memmove(p + l2, p, l1 - (p - str) + 1);
memcpy(p, subs, l2);
}
}
return p;
}
#define CAPACITY 100
int
main (int ac, char *av[])
{
if (ac < 4)
exit((puts("Usage: ./a.out string insert-part char-to-lookup"), 1));
if (strlen(av[1]) > CAPACITY - 1)
exit((puts("string too long"), 1));
char res[CAPACITY];
strcpy(res, av[1]);
int err;
if (!insert(res, sizeof(res), av[2], av[3][0], &err))
puts(err ? "ovefflow" : "not found");
else
puts(res);
}
Читайте man-ы на strchr, memmove и memcpy.
Если далее что-то останется непонятно -- спрашивайте.
Update
Внесем небольшое усовершенствование, позволяющее делать вставку также и в начало строки. Для этого надо передать 4-й аргумент (char c
) равным 0.
void insert(char* p, const char* m, char delim)
{
while (*p++ != delim);
// после этого цикла указатель указывает на следующий
// символ после символа разделителья
*p = '\0';
// тут мы ставим завершающий символ
strcat(p, m);
// чтобы вызвать функцию добавления строки
}
p.s. strcat
нетрудно написать самому
const char str[] = "Rasim - Sehr Gut!";
const char symbol = '-';
const size_t str_length = sizeof(str) / sizeof(char);
const char str_to_insert[] = "and Misar";
const size_t str_to_insert_length = sizeof(str_to_insert) / sizeof(char);
char str_result[str_length+str_to_insert_length - 1];
int index = 0;
for (int i = 0; i < str_length; i++) {
str_result[i] = str[i];
if (str[i] == symbol) {
index = i;
break;
}
}
for (int i = 0; i < str_to_insert_length - 1; i++) {
str_result[i + index + 1] = str_to_insert[i];
}
for (int i = index + 1; i < str_length; i++) {
str_result[i + str_to_insert_length - 1] = str[i];
}
Если нельзя использовать string, то придётся реализовывать всё самому. Найдём позицию символа, перебирая посимвольно первую строку, а заодно копируя просмотренные символы во вторую. После того, как в цикле будет найден необходимый символ, выбегаем из цикла и копируем посимвольно строку для вставки с той позиции, на которой мы остановились. Обратим внимание, что мы не копируем последний символ - он означает завершение строки и невидим для нас. Далее закончим махинации, скопировав в результат ещё не просмотренный остаток оригинальной строки.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Изучаю Qt, наткнулся на такую проблемуМне требуется быстро менять ui файлы по ходу выполнения программы
Ввод данных точно также как в рюкзаке, только суммарный вес должен быть таким, что при добавлении любого другого объекта в оптимальное множество,...
Как в c++ рекурсивно напечатать названия всех файлов в директории, переданной параметром программе? Например, для следующей структуры