[英]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
部分處理丟失。
可能會有所幫助。 這符合所有出現,我的意思是這個詞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 */
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.