函数替换子字符串返回错误答案 [英] function replace substring returns incorrect answer
问题描述
我有一个程序替换字符串中的子字符串.这个想法是在 original_string
中找到 string_to_be_replaced
,然后 realloc
new_string
并将其连接到 replace_by
字符串.它适用于某些情况,但在某些情况下(如下所示),它返回错误的答案:
输入:
<块引用>abc def ghi//原始字符串(a空格)//要替换的字符串第1234章
输出:
<块引用>abc1234defT123ghi
预期输出:
<块引用>abc1234def1234ghi
在调试的时候,我发现第一次替换完成后,new_string
中出现了一个错误的字符.
请告诉我为什么会发生这种情况以及如何解决.任何帮助将不胜感激.
#include #include #include #include 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);免费(原始字符串);免费(string_to_be_replaced);免费(replace_by);返回0;}void fgetsWithoutNewline(char *s, size_t maxCount, FILE *fp){如果(fgets(s,maxCount,fp)){s[strcspn(s, "\n")] = '\0';}返回;}char *replaceString(char *original_tring, char *string_to_be_replaced, char *replace_by){如果 (!original_tring || !string_to_be_replaced || !replace_by){返回空;}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);我 += strlen(string_to_be_replaced) - 1;//i 和 j 用于跟踪原始字符串和新字符串的最后一个字符j += strlen(replace_by) - 1;}别的{new_string[j] = original_tring[i];}}返回新字符串;}bool sameString(char *original_tring, char *string_to_be_searched, size_t start){如果 (strlen(string_to_be_searched) + 开始 > strlen(original_tring)){返回假;}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]){返回假;}}返回真;}
症状很明显,字符串不是空终止的.
尝试以下方法:
char *replaceString(char *original_tring, char *string_to_be_replaced, const char *replace_by){如果 (!original_tring || !string_to_be_replaced || !replace_by){返回空;}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);我 += strlen(string_to_be_replaced) - 1;j += strlen(replace_by) - 1;}别的{new_string[j] = original_tring[i];}new_string[j + 1] = '\0';//这里}返回新字符串;}
I have a program replacing a substring in a string. The idea is to find the string_to_be_replaced
in original_string
, then realloc
the new_string
and connect it to replace_by
string. It works for some cases but in some cases like below, it return wrong answer:
Input:
abc def ghi //orginal string (a blank space) //string to be replaced 1234 //replace by
Output:
abc1234defT123ghi
Expected output:
abc1234def1234ghi
When I debug it, I saw a wrong character has been filled in the new_string
after the first replacement had been done.
Please tell me why does this happen and how to fix it. Any help would be appreciated.
#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;
}
Well the symptoms are clear, the string is not being null terminated.
Try the follwing:
char *replaceString(char *original_tring, char *string_to_be_replaced, const 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;
j += strlen(replace_by) - 1;
}
else
{
new_string[j] = original_tring[i];
}
new_string[j + 1] = '\0'; //here
}
return new_string;
}
这篇关于函数替换子字符串返回错误答案的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!