Замена подстроки на строку меньшего размера
Программа просит на ввод строку,если в ней встречаются подстроки
- "www.facebook.com"
- "facebook.com"
- "vk.com"
- "www.vk.com"
Должна быть произведена замена на ***, как показано в примере (What is better, vk.com or facebook.com? → What is better, *** or ***?) Реализация должна быть с помощью стандартных функций библиотеки string.h. Не выходит решение этой задачи из-за того что функция strncpy копирует в подстроки всего-лишь 3 символа,и выходит вот такая вот штука What is better, ***com or ***ebook.com? Как это можно поправить?(Предполагаю что стоит копировать введенную строку в буфер и дальше с ней какие-то махинации проводить)
#include <stdio.h>
#include <string.h>
int read_line(char adress[], int n);
int antisn(char* adress);
int main() {
char adress[300];
printf("Input adress: ");
read_line(adress, 300);
antisn(adress);
}
int read_line(char adress[], int n) {
int ch, i = 0;
while ((ch = getchar()) != '\n')
if (i < n)
adress[i++] = ch;
adress[i] = '\0';
return i;
}
int antisn(char* adress) {
char* vk;
char* wvk;
char* fb;
char* wfb;
wvk = strstr(adress, "www.vk.com");
if (wvk != NULL) {
strncpy(wvk, "***", 3);
}
wfb = strstr(adress, "www.facebook.com");
if (wfb != NULL) {
strncpy(wfb, "***", 3);
}
vk = strstr(adress, "vk.com");
if (vk != NULL) {
strncpy(vk, "***", 3);
}
fb = strstr(adress, "facebook.com");
if (fb != NULL) {
strncpy(fb, "***", 3);
}
if (vk == NULL && wvk == 0 && fb == 0 && wfb == 0)
printf("Nety");
else
puts(adress);
return 0;
}
Ответы (1 шт):
Функция replace заменяет подстроку на более короткую. Для "подтягивания" хвоста используется memmove. Это единственная функция которая умеет копировать перекрывающиеся участки памяти:
#include <assert.h>
#include <stdio.h>
#include <string.h>
void replace(char *text, const char *old, const char *new) {
assert(strlen(old) >= strlen(new));
char *p = strstr(text, old);
if (p != NULL) {
memcpy(p, new, strlen(new));
memmove(p + strlen(new), p + strlen(old), strlen(p + strlen(old)) + 1);
}
}
int main() {
char text[] = "https://www.vk.com/path";
replace(text, "www.vk.com", "***");
puts(text);
}