関数replacesubstringは間違った答えを返します

ベッカー

文字列の部分文字列を置き換えるプログラムがあります。アイデアは見つけることですstring_to_be_replacedではoriginal_string、その後とに接続文字列。場合によっては機能しますが、以下のような場合には、間違った答えが返されます。reallocnew_stringreplace_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で終了していません。

次のことを試してください。

ライブデモ

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

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javaは間違った答えを返し続けます

分類Dev

関数を適用すると間違った答えが返されます

分類Dev

SQL関数は常に間違った値を返します

分類Dev

日付フォーマット関数が間違った答えを返すのはなぜですか?

分類Dev

更新は間違った応答を返します

分類Dev

pminは間違った答えを出します

分類Dev

NCalc Evaluate()は間違った答えを出します

分類Dev

maths.sinはJavaで間違った答えをします

分類Dev

Mathematica FindInstance []は間違った答えを出します

分類Dev

間違った入力の後、関数はNoneを返します

分類Dev

MySQL関数が間違った値を返しています

分類Dev

Mathematicaが導関数に対して一見間違った答えを出すのはなぜですか?

分類Dev

ベクトルによる行列の乗算は間違った答えを返しますJava

分類Dev

atanfは私に間違った答えを与えます

分類Dev

java Arrays.binarySearchは間違った答えを出しますが、ビット単位の補数は正しい答えを与えます

分類Dev

平均関数の間違った答え?

分類Dev

クイーンズアタックIIの関数が間違った答えを返す

分類Dev

素数プログラムは間違った答えを出します

分類Dev

HIVEでの時差計算は間違った答えを出します

分類Dev

PHPのbin2hexは間違った答えを提供します

分類Dev

Windows8のDevC ++ 5.11は間違った答えを生成します

分類Dev

XSLT:string-length($ variable)は間違った答えを出します

分類Dev

php max()関数は間違った結果を出します

分類Dev

一部の関数は、なしではなく間違った結果を返します

分類Dev

出力は正しいですが、SPOJは私に間違った答えを与えました

分類Dev

含まれている関数は明らかに間違ったfalseを返します

分類Dev

SQL Server:合計関数が間違った値を返しています

分類Dev

間違った答えを与える数を比較するJavascript

分類Dev

関数は、配列入力のサイズが1の場合にのみ間違った値を返します

Related 関連記事

  1. 1

    Javaは間違った答えを返し続けます

  2. 2

    関数を適用すると間違った答えが返されます

  3. 3

    SQL関数は常に間違った値を返します

  4. 4

    日付フォーマット関数が間違った答えを返すのはなぜですか?

  5. 5

    更新は間違った応答を返します

  6. 6

    pminは間違った答えを出します

  7. 7

    NCalc Evaluate()は間違った答えを出します

  8. 8

    maths.sinはJavaで間違った答えをします

  9. 9

    Mathematica FindInstance []は間違った答えを出します

  10. 10

    間違った入力の後、関数はNoneを返します

  11. 11

    MySQL関数が間違った値を返しています

  12. 12

    Mathematicaが導関数に対して一見間違った答えを出すのはなぜですか?

  13. 13

    ベクトルによる行列の乗算は間違った答えを返しますJava

  14. 14

    atanfは私に間違った答えを与えます

  15. 15

    java Arrays.binarySearchは間違った答えを出しますが、ビット単位の補数は正しい答えを与えます

  16. 16

    平均関数の間違った答え?

  17. 17

    クイーンズアタックIIの関数が間違った答えを返す

  18. 18

    素数プログラムは間違った答えを出します

  19. 19

    HIVEでの時差計算は間違った答えを出します

  20. 20

    PHPのbin2hexは間違った答えを提供します

  21. 21

    Windows8のDevC ++ 5.11は間違った答えを生成します

  22. 22

    XSLT:string-length($ variable)は間違った答えを出します

  23. 23

    php max()関数は間違った結果を出します

  24. 24

    一部の関数は、なしではなく間違った結果を返します

  25. 25

    出力は正しいですが、SPOJは私に間違った答えを与えました

  26. 26

    含まれている関数は明らかに間違ったfalseを返します

  27. 27

    SQL Server:合計関数が間違った値を返しています

  28. 28

    間違った答えを与える数を比較するJavascript

  29. 29

    関数は、配列入力のサイズが1の場合にのみ間違った値を返します

ホットタグ

アーカイブ