簡體   English   中英

我的功能出了什么問題(從文本文件中刪除字符串)

[英]what's wrong with my function (removing string from text file)

我想編寫一個從文本文件中刪除某些單詞的函數。 程序工作正常,但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;
 }

使用memmove而不是strcpy來隨機播放數據,因為如果源和目標重疊,則不建議使用strcpy memmove在重疊情況下可以安全使用。

我認為問題在於以下代碼

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

它不查找連續字母。 如果字母不匹配,則將從下一個繼續。 我的意思是else部分處理丟失。

可能會有所幫助。 這符合所有出現,我的意思是這個詞gogood 可以根據您的需要進行調整。

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 */
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM