Необходимо вставить строку в другую строку, но после определенного символа. Без использования 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, то придётся реализовывать всё самому. Найдём позицию символа, перебирая посимвольно первую строку, а заодно копируя просмотренные символы во вторую. После того, как в цикле будет найден необходимый символ, выбегаем из цикла и копируем посимвольно строку для вставки с той позиции, на которой мы остановились. Обратим внимание, что мы не копируем последний символ - он означает завершение строки и невидим для нас. Далее закончим махинации, скопировав в результат ещё не просмотренный остаток оригинальной строки.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Изучаю Qt, наткнулся на такую проблемуМне требуется быстро менять ui файлы по ходу выполнения программы
Ввод данных точно также как в рюкзаке, только суммарный вес должен быть таким, что при добавлении любого другого объекта в оптимальное множество,...
Как в c++ рекурсивно напечатать названия всех файлов в директории, переданной параметром программе? Например, для следующей структуры