У меня есть программа, заменяющая подстроку в строке. Идея состоит в том, чтобы найти string_to_be_replaced
в original_string
, затем realloc
new_string
и связать его со строкой replace_by
. Он работает в некоторых случаях, но в некоторых случаях, как показано ниже, он возвращает неправильный ответ:
Вход:
abc def ghi //orginal string
(a blank space) //string to be replaced
1234 //replace by
Выход:
abc1234defT123ghi
Ожидаемый результат:
abc1234def1234ghi
Когда я отлаживаю его, я увидел, что в new_string
был введен неправильный символ после того, как была сделана первая замена .
Подскажите пожалуйста, почему так происходит и как это исправить. Любая помощь будет принята с благодарностью.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
void fgetsWithoutNewline(char *s, size_t maxCount, FILE *fp);
bool sameString(char *original_tring, char *string_to_be_searched, size_t start);
char *replaceString(char *original_tring, char *string_to_be_replaced, char *replace_by);
int main()
{
char *original_string = malloc(100);
fgetsWithoutNewline(original_string, 99, stdin);
char *string_to_be_replaced = malloc(100);
fgetsWithoutNewline(string_to_be_replaced, 99, stdin);
char *replace_by = malloc(100);
fgetsWithoutNewline(replace_by, 99, stdin);
char *s = replaceString(original_string, string_to_be_replaced, replace_by);
printf("%s", s);
free(original_string);
free(string_to_be_replaced);
free(replace_by);
return 0;
}
void fgetsWithoutNewline(char *s, size_t maxCount, FILE *fp)
{
if (fgets(s, maxCount, fp))
{
s[strcspn(s, "\n")] = '\0';
}
return;
}
char *replaceString(char *original_tring, char *string_to_be_replaced, char *replace_by)
{
if (!original_tring || !string_to_be_replaced || !replace_by)
{
return NULL;
}
char *new_string = malloc(strlen(original_tring));
for (size_t i = 0, j = 0; i < strlen(original_tring); i++, j++)
{
if (sameString(original_tring, string_to_be_replaced, i))
{
new_string = realloc(new_string, strlen(new_string) + strlen(replace_by) - strlen(string_to_be_replaced));
strcat(new_string, replace_by);
i += strlen(string_to_be_replaced) - 1; // i and j use to track the last character of original string and new string
j += strlen(replace_by) - 1;
}
else
{
new_string[j] = original_tring[i];
}
}
return new_string;
}
bool sameString(char *original_tring, char *string_to_be_searched, size_t start)
{
if (strlen(string_to_be_searched) + start > strlen(original_tring))
{
return false;
}
size_t end = strlen(string_to_be_searched) + start;
for (size_t i = start, j = 0; i < end; i++, j++)
{
if (original_tring[i] != string_to_be_searched[j])
{
return false;
}
}
return true;
}