2016-10-10 111 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