0

テキストファイルから特定の単語を削除する関数を書きたいです。プログラムは正常に動作しますが、valgrind は別のことを言います:

==3411== Source and destination overlap in strcpy(0x51f1c90, 0x51f1c92)
==3411==    at 0x4C2C085: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==3411==    by 0x400AD7: DELTEword (remove2.c:113)
==3411==    by 0x4009A1: main (remove2.c:73)

また、たとえば「go」という単語を削除しようとすると、「ro」という単語も削除されることがあります。なんで?

これが私のコードです:

int DELTEword(char *word, char *KEYword)
{
    int i, k = 0, l = 0, length;
    char *ptr;

    if(word != NULL)
    {
        length = strlen(KEYword);
        for(i = 0; word[i] != '\0'; i++)
        {
            if(word[i] == KEYword[k])
            {
                l++;
                k++;
            }

            if(l == length)
            {
                ptr = &word[i];
                strcpy((ptr - length) + 1, ptr + 1);
                l = 0;
                k = 0;
            }
        }
        return 1;
    }
    else return 0;
 }
4

2 に答える 2

0

問題は次のコードにあると思います

for(i = 0; word[i] != '\0'; i++)
{
    if(word[i] == KEYword[k])
    {
        l++;
        k++;
    }
}

連続文字は検索しません。文字が一致しなければ、次から続きます。つまり、elseパーツ処理が欠落しています。

これが役立つかもしれません。これはすべての出現に一致します。つまり、 in という単語goですgood。必要に応じて調整できます。

length = strlen(KEYword);
for(i = 0; word[i] != '\0'; i++)
{
    k = i;
    l = 0;
    for (j = 0; j < length; j++) {
        if(word[k] == KEYword[j])
        {
            l++;
            k++;
        }
        else
        {
            break;
        }
    }
    /* All letters matched */
    if (l == length) {
        /* do some stuff */
    }
}
于 2013-09-13T10:28:34.127 に答える