Заменить подстроку на другую легко, если обе подстроки имеют одинаковую длину:
- найдите положение подстроки с помощью
strstr
- , если она присутствует, используйте
memcpy
перезаписать его новой подстрокой. - назначение указателя с
*strstr(m, "on") = "in";
неверно и должно генерировать предупреждение компилятора.Вы бы избежали таких ошибок с gcc -Wall -Werror
. - , однако отметьте, что вы не можете изменить строковый литерал, вам нужно определить инициализированный массив
char
, чтобы вы могли его изменить.
Вот исправленная версия:
#include <stdio.h>
#include <string.h>
int main(void) {
char m[] = "cat on couch";
char *p = strstr(m, "on");
if (p != NULL) {
memcpy(p, "in", 2);
}
printf("%s\n", m);
return 0;
}
Если замена короче, код будет немного сложнее:
#include <stdio.h>
#include <string.h>
int main(void) {
char m[] = "cat is out roaming";
char *p = strstr(m, "out");
if (p != NULL) {
memcpy(p, "in", 2);
memmove(p + 2, p + 3, strlen(p + 3) + 1);
}
printf("%s\n", m);
return 0;
}
В общем случае это еще сложнееи массив должен быть достаточно большим, чтобы приспособиться к разнице длины:
#include <stdio.h>
#include <string.h>
int main(void) {
char m[30] = "cat is inside the barn";
char *p = strstr(m, "inside");
if (p != NULL) {
memmove(p + 7, p + 6, strlen(p + 6) + 1);
memcpy(p, "outside", 7);
}
printf("%s\n", m);
return 0;
}
Вот обобщенная функция, которая обрабатывает все случаи:
#include <stdio.h>
#include <string.h>
char *strreplace(char *s, const char *s1, const char *s2) {
char *p = strstr(s, s1);
if (p != NULL) {
size_t len1 = strlen(s1);
size_t len2 = strlen(s2);
if (len1 != len2)
memmove(p + len2, p + len1, strlen(p + len1) + 1);
memcpy(p, s2, len2);
}
return s;
}
int main(void) {
char m[30] = "cat is inside the barn";
printf("%s\n", m);
printf("%s\n", strreplace(m, "inside", "in"));
printf("%s\n", strreplace(m, "in", "on"));
printf("%s\n", strreplace(m, "on", "outside"));
return 0;
}