0

这是我拥有的代码。该函数应该删除字符串数组中的一个字符串,然后将所有元素向左移动以缩小差距。

void removeWord(char ***array, int *count){

    char word[41];

    printf("Enter a word: ");
    fscanf(stdin, " ");
    fscanf(stdin, "%s", word);
    bool wordFound = false;
    int indexOfWord = 0;
    for(int i = 0; i < *count; i++){
            if(strcasecmp(word, (*array)[i]) == 0){
                    wordFound = true;
                    indexOfWord = i;
                    break;
            }
    }
    if(wordFound == false){
            fprintf(stderr, "Word not found in dictionary.\n");
    }
    else{
            free((*array)[indexOfWord]);
            // Decrement count
            (*count)--;
            for(int i = indexOfWord; i < *count; i ++){
                    // Shift elements over to the left by 1 to close the gap
                    (*array)[i] = (*array)[i+1];
            }
            // If the word to remove isn't the last element, remove the last element to prevent duplicate words
            if(indexOfWord != *count) free((*array)[*count]);

    }
}

当我删除数组中的最后一个单词时,该函数正常工作......但是当我删除第二个到最后一个单词时,它会删除它,但也会将最后一个元素设置为某个奇数值/空值。如果有人能指出我正确的方向,我一直在努力解决这个问题,我将不胜感激......谢谢,如果需要更多信息,请随时询问。

- - - - - - - - - - - -更新

答案是删除最后的 if 语句,没有必要:

void removeWord(char ***array, int *count){

    char word[41];

    printf("Enter a word: ");
    fscanf(stdin, " ");
    fscanf(stdin, "%s", word);
    bool wordFound = false;
    int indexOfWord = 0;
    for(int i = 0; i < *count; i++){
            if(strcasecmp(word, (*array)[i]) == 0){
                    wordFound = true;
                    indexOfWord = i;
                    break;
            }
    }
    if(wordFound == false){
            fprintf(stderr, "Word not found in dictionary.\n");
    }
    else{
            free((*array)[indexOfWord]);
            // Decrement count
            (*count)--;
            for(int i = indexOfWord; i < *count; i ++){
                    // Shift elements over to the left by 1 to close the gap
                    (*array)[i] = (*array)[i+1];
            }
    }
}
4

2 回答 2

0

问题在于此代码:

if(indexOfWord != *count) free((*array)[*count]);

问题是由于,您已经减少了*count,所以现在如果您使用修改后*count的值,它将引用当前实际的最后一个值。也不需要释放最后一个元素,因为当前最后一个元素和前一个最后一个元素指向相同的内存,所以只需将指针设置为NULL.

将其更改为:

if(indexOfWord != *count) (*array)[((*count) + 1)] = NULL;
于 2013-10-18T17:23:23.760 回答
0

在您要删除的单词的else开头free()。然后,您将所有剩余的单词移过来。最终结果是您的array[count-1](最后一个有效元素)array[count]都包含相同的指针。然后你 free array[count]array[count-1]包含一个指向释放内存的指针。

为什么是第二个free()?你想删除 1 个词,你free()那个词,你就完成了。

另外,为什么char *** array?在您使用它的任何地方,您都在(*array)取消引用它一次。为什么不将char **指针数组传递给函数?

于 2013-10-18T17:43:37.420 回答