函数替换子字符串返回错误答案 [英] function replace substring returns incorrect answer

查看:46
本文介绍了函数替换子字符串返回错误答案的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个程序替换字符串中的子字符串.这个想法是在 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:

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

这篇关于函数替换子字符串返回错误答案的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆