Как вставить строку в строку после определенного символа?

224
20 марта 2019, 21:10

Необходимо вставить строку в другую строку, но после определенного символа. Без использования String и других библиотек

Answer 1
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");

Answer 2

Без 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.

Answer 3
void insert(char* p, const char* m, char delim)
{
    while (*p++ != delim);
    // после этого цикла указатель указывает на следующий
    // символ после символа разделителья
    *p = '\0';
    // тут мы ставим завершающий символ
    strcat(p, m);
    // чтобы вызвать функцию добавления строки
}

p.s. strcat нетрудно написать самому

Answer 4
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, то придётся реализовывать всё самому. Найдём позицию символа, перебирая посимвольно первую строку, а заодно копируя просмотренные символы во вторую. После того, как в цикле будет найден необходимый символ, выбегаем из цикла и копируем посимвольно строку для вставки с той позиции, на которой мы остановились. Обратим внимание, что мы не копируем последний символ - он означает завершение строки и невидим для нас. Далее закончим махинации, скопировав в результат ещё не просмотренный остаток оригинальной строки.

READ ALSO
Динамическая смена ui файлов в Qt

Динамическая смена ui файлов в Qt

Изучаю Qt, наткнулся на такую проблемуМне требуется быстро менять ui файлы по ходу выполнения программы

181
Скалярное произведение чисел (С++)

Скалярное произведение чисел (С++)

Есть код скалярного произведения:

145
Как решить задачу &ldquo;обратного&rdquo; рюкзака в c++?

Как решить задачу “обратного” рюкзака в c++?

Ввод данных точно также как в рюкзаке, только суммарный вес должен быть таким, что при добавлении любого другого объекта в оптимальное множество,...

161
Рекурсивная печать файлов проекта

Рекурсивная печать файлов проекта

Как в c++ рекурсивно напечатать названия всех файлов в директории, переданной параметром программе? Например, для следующей структуры

122