#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *str_create(const char *str)
{
int len = strlen(str);
char *pStr = (char *)calloc(len + 1, sizeof(char));
if (pStr != NULL)
strcpy(pStr, str);
return pStr;
}
int str_concat(char **p, const char *str)
{
int oldlen = strlen(*p);
int len = strlen(str);
int newsize = oldlen + len + 1;
char *q = realloc(*p, newsize * sizeof(char));
if (q == NULL)
return 0;
*p = q;
strcpy(*p + oldlen, str);
return 1;
}
int str_insert(char **p, const int pos, const char *str)
{
int oldlen = strlen(*p);
int len = strlen(str);
int newsize = oldlen + len + 1;
char *q = realloc(*p, newsize * sizeof(char));
if (q == NULL)
return 0;
*p = q;
memmove(*p + pos + len, *p + pos, oldlen - pos + 1);
memcpy(*p + pos, str, len);
return 1;
}
int str_replace_once(const char *find, const char *replace, char **p)
{
char *ch = strstr(*p, find);
int newsize, oldlen, flen, rlen, pos;
char *q;
if (ch == NULL)
return 0;
pos = ch - *p;
oldlen = strlen(*p);
flen = strlen(find);
rlen = strlen(replace);
newsize = oldlen - flen + rlen + 1;
q = realloc(*p, newsize * sizeof(char));
if (q == NULL)
return 0;
*p = q;
ch = *p + pos;
memmove(ch + rlen, ch + flen, oldlen - pos - flen + 1); // including \0 at the end
memcpy(ch, replace, rlen);
return 1;
}
int str_replace(char *find, char *replace, char **p)
{
int count = 0;
while (str_replace_once(find, replace, p))
count++;
return count;
}
int str_reset(char **p, const char *newstr)
{
int len = strlen(newstr);
char *q = realloc(*p, (len + 1) * sizeof(char));
if (q == NULL)
return 0;
*p = q;
strcpy(*p, newstr);
return 1;
}
int main(int argc, char *argv[])
{
char *str = str_create("abcdef"); // str = "abcdef"
int count;
puts(str);
str_concat(&str, "123456"); // str += "123456"
puts(str);
str_insert(&str, 2, "CD");
puts(str);
str_replace_once("f1", "{mine}", &str);
puts(str);
str_reset(&str, "ababababca"); // str = "ababababc"
puts(str);
count = str_replace("b", "?", &str);
puts(str);
printf("Replacement count: %d\n", count);
count = str_replace("a", "{you}", &str);
puts(str);
printf("Replacement count: %d\n", count);
str_insert(&str, 0, "The result is "); // str = str + ...
str_concat(&str, ".");
puts(str);
free(str);
return 0;
}