C中的独特单词计数器

时间:2017-01-15 16:59:33

标签: c unique counting words

我正在用C语言编写一个小程序,它应该计算c中的唯一单词。 要做到这一点,我有一个wordbook来存储所有找到的单词。 Normaly它应该只放入尚未包含在其中的单词,但它会继续输入所有写入的单词。 我该如何解决这个问题,如何删除我的词典“woerterbuch”中的所有空白部分?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char lies_wort(char *Text);
char suche_wort(char *wort);
char neues_wort(char *wort);
char *woerterbuch[1000];

int main(void)
{
    char Text[1000];
    printf("Bitte Text eingeben : \n") ;
    fgets (Text, 1000, stdin);
    lies_wort(Text);
    int i;
    for(i=0;i<1000;i++){
        printf("woerterbuch :%s\n",woerterbuch[i]);}
}
char lies_wort(char *Text){
    char *wort;
    int i=1;
    wort = strtok(Text, " ,.!?;:");
    while(wort != NULL) {
        suche_wort(wort);
        printf("gefunden %d: %s\n", i++, wort);
        wort = strtok(NULL, " ,.!?;:");}
}
char suche_wort(char *wort)
{
    int i;
    for (i = 0; i>1000; i++){
        if (!strcmp(woerterbuch[i],wort)){return 0;}}
    neues_wort(wort);
    return 0;
}
char neues_wort(char *wort)
{
    int i;
    for (i=0; i<1000; i++){
        if(woerterbuch[i]==0){
            woerterbuch[i]=wort;
            return 0;}}
}

对于测试这个程序只是打印“woerterbuch”中的所有单词,这样我就可以检查它是否正常工作。

2 个答案:

答案 0 :(得分:1)

suche_wort

for (i = 0; i>1000; i++)

应该是

for (i = 0; i<1000; i++)

你的循环每次都会立即终止。

答案 1 :(得分:0)

我相信您的代码中存在一些问题:

首先,在这一行:

woerterbuch[i]=wort;

只会覆盖woerterbuch[i]的地址,这会导致错误的结果。相反,您需要通过mallocstrdupworterbuch[i]分配空间。

您可以为单个指针使用分配空间,如下所示:

worterbuch[i] = malloc(strlen(wort)+1);

注意:最后检查来自malloc()free()这些指针的回报总是好的。

现在,由于指针指向某处,您可以将内容复制到其中。您可以使用strcpy执行此操作。如果您想跳过此复制步骤,则可以使用strdup()代替。

其次,您可以在char *woerterbuch[1000];中管理此指针数组,而不是全局定义struct

typedef struct {
    char *woerterbuch[1000];
    size_t n;
} worterbuch;

这样可以更轻松地管理您的阵列。

第三,你没有检查fgets()的回报。如果不成功,这可以返回NULL。你还应该在这里检查缓冲区溢出。

最后,如果他们worterbuch中有很多单词,使用线性搜索检查重复项可能效率不高。此过程平均 O(N)时间。相反,您可以使用二进制搜索,平均 O(logN),因此如果n变得非常大,效率会更高。

这是我前一段时间写的一些类似的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TEXTSIZE 1000

typedef struct {
    char *dictionary[TEXTSIZE];
    size_t numwords;
} dictionary_t;

void read_text(char *text);
void read_words(char *text, dictionary_t *dict);
int search_word(dictionary_t *dict, char *word);
void print_words(dictionary_t *dict);
int str_cmp(const void *a, const void *b);

int main(void) {
    dictionary_t dict;
    char text[TEXTSIZE];

    read_text(text);

    read_words(text, &dict);

    print_words(&dict);

    return 0;
}

void read_text(char *text) {
    size_t slen;

    printf("Please enter text: \n");
    if (fgets(text, TEXTSIZE, stdin) == NULL) {
        fprintf(stderr, "Error reading text\n");
        exit(EXIT_FAILURE);
    }

    /* removes '\n' character from fgets(), and checks for overflow */
    slen = strlen(text);
    if (slen > 0) {
        if (text[slen-1] == '\n') {
            text[slen-1] = '\0';
        } else {
            printf("Buffer overflow detected.\n");
            exit(EXIT_FAILURE);
        }
    }

    if (!*text) {
        printf("No text entered.\n");
        exit(EXIT_FAILURE);
    }
}

void read_words(char *text, dictionary_t *dict) {
    char *word;
    const char *delim = " ,.!?;:";
    dict->numwords = 0;

    word = strtok(text, delim);
    while (word != NULL) {

        if (search_word(dict, word)) {

            /* allocate space for ptr */
            dict->dictionary[dict->numwords] = malloc(strlen(word)+1);
            if (!dict->dictionary[dict->numwords]) {
                printf("Cannot allocate word.\n");
                exit(EXIT_FAILURE);
            }

            /* copy it into array */
            strcpy(dict->dictionary[dict->numwords], word);

            /* increment count, ready for next word */
            dict->numwords++;
        }
        word = strtok(NULL, delim);
    }
}

/* linear searching the word */
int search_word(dictionary_t *dict, char *word) {
    size_t i;

    for (i = 0; i < dict->numwords; i++) {
        if (strcmp(dict->dictionary[i], word) == 0) {
            return 0;
        }
    }
    return 1;
}

/* cmp function for sorting dictionary */
int str_cmp(const void *a, const void *b) {
    const char **str1 = (const char **)a;
    const char **str2 = (const char **)b;

    return strcmp(*str1, *str2);
}

void print_words(dictionary_t *dict) {
    size_t i;

    /* sort using qsort */
    qsort(dict->dictionary, dict->numwords, sizeof(*(dict->dictionary)), str_cmp);

    printf("\nDictionary:\n");
    for (i = 0; i < dict->numwords; i++) {
        printf("%s\n", dict->dictionary[i]);

        /* freeing memory previosly allocated from malloc() */
        free(dict->dictionary[i]);
        dict->dictionary[i] = NULL;
    }
}