gpt4 book ai didi

c - 函数替换子字符串返回错误答案

转载 作者:行者123 更新时间:2023-12-02 02:47:57 24 4
gpt4 key购买 nike

我有一个程序替换字符串中的子字符串。这个想法是在original_string中找到string_to_be_replaced,然后reallocnew_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;
}

最佳答案

症状很明显,字符串没有以 null 结尾。

尝试以下操作:

Live demo

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;
}

关于c - 函数替换子字符串返回错误答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62486537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com