2016-10-10 90 views
-1

我想弄清楚爲什麼我不能從字典數組中刪除元素。有人能幫我嗎? removeWord函數的功能與刪除最後添加的單詞時的功能相同,但在嘗試刪除其他單詞時不起作用。從指針數組中刪除元素C

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAX_NUMBER_OF_WORDS 11 

int clear(){ 
    while(getchar()^'\n'); 
    return 0; 
} 

int numberOfWordsInDict(char **dict){ 
    int i = 0; 
    int c1 = 0; 
    for (i = 0; i < MAX_NUMBER_OF_WORDS; ++i){ 
     if (dict[i] != 0){ 
      c1++; 
     } 
    } 
    return c1; 
} 

void addWord(char **dict, char *word){ 
    int c1 = numberOfWordsInDict(dict); 
    char *word1; 
    if (c1 >= 0 && c1 < 10){ 
     word1 = (char*) malloc(sizeof(char)*(strlen(word)+1)); 
     dict[c1] = word1; 
     strncpy(dict[c1], word, strlen(word)); 
     dict[c1][strlen(word)] = '\0'; 
    } else if (c1 >= 10){ 
     printf("Dictionary is already full!\n"); 
    } 
} 

void printDict(char **dict){ 
    int i = 0; 
    int c1 = numberOfWordsInDict(dict); 
    printf("Dictionary:\n"); 
    if (c1 == 0){ 
     printf("The dictionary is empty.\n"); 
    } else if (c1 > 0 && c1 <= 10){ 
     while (dict[i] != NULL){ 
      printf("- %s\n", dict[i]); 
      i++; 
     } 
    } 
} 

void removeWord(char **dict, char *word){ 
    int i = 0; 
    for (i = 0; i < MAX_NUMBER_OF_WORDS; i++){ 
     if (strncmp(dict[i], word, strlen(word)+1) == 0){ 
      dict[i] = 0;// can only delete the last element of dict properly. 
      break; 
     } 
    } 
} 

int main(){ 
    char *dict[MAX_NUMBER_OF_WORDS] = {}; 
    char word[1024] = {}; 
    char command; 

    while(1){ 
     printf("Command (a/p/r/q): "); 
     while(scanf("%s", &command) == 1){ 
      break; 
     } 
     ; 
     clear(); 

     if (command == 'a'){  // add word 
      scanf("%[^\n]s", &word); 
      clear(); 
      addWord(dict, word); 
     } else if (command == 'p'){  // print dict 
      printDict(dict);   
     } else if (command == 'r'){  // remove word 
      printf("Remove a word: "); 
      scanf("%[^\n]s", &word); 
      clear(); 
      removeWord(dict, word); 
     } else if (command == 'q'){  // quit 
      break; 
     } 
    } 

    int i = 0; 
    for (i = 0; i < MAX_NUMBER_OF_WORDS; i++){ 
     free(dict[i]); 
    } 

    return 0; 
} 

例如輸入:

a 
dog 
a 
cat 
a 
apple 

殼體1:

r 
apple 
p 
// output = 
Dictionary: 
- dog 
- cat 
a 
uniform 
p 
// output = 
Dictionary: 
- dog 
- cat 
- uniform 
// works fine 

殼體2

r 
cat 
p 
// output = 
Dictionary: 
- dog 
a 
book 
p 
// output = 
Dictionary: 
- dog 
// doesn't work as expected 
+0

好的,你已經給我們你的代碼。現在給我們提供示例輸入,你期望的輸出是什麼以及你看到的是什麼輸出。 http://stackoverflow.com/help/mcve –

+0

感謝您的評論,我編輯了主帖。 – kbim

回答

0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAX_NUMBER_OF_WORDS 11 

int clear(){ 
    while(getchar()^'\n'); 
    return 0; 
} 

int numberOfWordsInDict(char **dict){ 
    int c1 = 0; 
    for(int i = 0; i < MAX_NUMBER_OF_WORDS; ++i){ 
     if (dict[i] != 0){ 
      c1++; 
     } 
    } 
    return c1; 
} 

int vacancy(char **dict){ 
    for(int i = 0; i < MAX_NUMBER_OF_WORDS; ++i){ 
     if (dict[i] == 0){ 
      return i; 
     } 
    } 
    return -1; 
} 

void addWord(char **dict, char *word){ 
    int c1 = vacancy(dict);//It is not possible to use the registration number as an additional index. 

    if (-1 != c1){ 
     dict[c1] = malloc(strlen(word)+1); 
     strcpy(dict[c1], word); 
    } else { 
     printf("Dictionary is already full!\n"); 
    } 
} 

void printDict(char **dict){ 
    int c1 = numberOfWordsInDict(dict); 
    printf("Dictionary:\n"); 
    if (c1 == 0){ 
     printf("The dictionary is empty.\n"); 
    } else { 
     for(int i = 0; i < MAX_NUMBER_OF_WORDS; ++i){ 
      if(dict[i]) 
       printf("- %s\n", dict[i]); 
     } 
    } 
} 

void removeWord(char **dict, char *word){ 
    for(int i = 0; i < MAX_NUMBER_OF_WORDS; i++){ 
     if (strcmp(dict[i], word) == 0){ 
      free(dict[i]);//need free 
      dict[i] = 0;// can only delete the last element of dict properly. 
      break; 
     } 
    } 
} 

int main(){ 
    char *dict[MAX_NUMBER_OF_WORDS] = { NULL }; 
    char word[1024] = { 0 };//forbids empty initializer braces 
    char command; 

    while(1){ 
     printf("Command (a/p/r/q): "); 
     scanf("%c", &command);//%s buffer over run 
     clear(); 

     if (command == 'a'){  // add word 
      scanf("%[^\n]", word); 
      clear(); 
      addWord(dict, word); 
     } else if (command == 'p'){ // print dict 
      printDict(dict);   
     } else if (command == 'r'){ // remove word 
      printf("Remove a word: "); 
      scanf("%[^\n]", word); 
      clear(); 
      removeWord(dict, word); 
     } else if (command == 'q'){ // quit 
      break; 
     } 
    } 

    int i = 0; 
    for (i = 0; i < MAX_NUMBER_OF_WORDS; i++){ 
     free(dict[i]); 
    } 

    return 0; 
} 
+0

感謝您的回答。我實際上忙於在addWord函數中查找我的索引出了什麼問題。事實上,使用numberOfWordsInDict是不可能的,因爲有些詞被覆蓋。也感謝其他評論,我會爲他們尋找。 – kbim

0

內部printDict()使用

while (i<MAX_NUMBER_OF_WORDS){ 
     if(dict[i] != 0) 
      printf("- %s\n", dict[i]); 
     i++; 
    } 

代替

while (dict[i] != NULL){ 
     printf("- %s\n", dict[i]); 
     i++; 
    } 

因爲即使你知道,如果有c1數的話,你不知道自己的位置在那些c1話都存在哪裏。 另外改變

while(scanf("%s", &command) == 1) 

while(scanf("%c", &command) == 1) 

因爲commandchar類型。

+0

感謝您的回答。根據您的建議,可以在字典中打印出所有剩餘(未刪除)的字詞。但是,在刪除一個新的單詞之後添加新單詞時,在調用函數numberOfWordsInDict時,c1索引也存在問題。 – kbim