C 字数问题

C 字数问题,c,string,return-value,C,String,Return Value,我正在努力完成我的一个C作业问题。以下是定义和示例IO: 描述 提供一篇文章作为输入。您必须计算每个单词的数量,并按字母顺序打印单词列表 样本输入 那是最好的时代,那是最糟糕的时代,那是一个充满活力的时代 智慧,它是愚蠢的时代,它是信仰的时代,它是 这是怀疑的时代,这是光明的季节,这是 黑暗的季节,那是希望的春天,那是生命的冬天 绝望,我们拥有一切,我们一无所有,我们 我们都直接去天堂,我们都直接去另一个 对 样本输出 age 2 all 2 before 2 belief 1 best 1 d

我正在努力完成我的一个C作业问题。以下是定义和示例IO:

描述

提供一篇文章作为输入。您必须计算每个单词的数量,并按字母顺序打印单词列表

样本输入

那是最好的时代,那是最糟糕的时代,那是一个充满活力的时代 智慧,它是愚蠢的时代,它是信仰的时代,它是 这是怀疑的时代,这是光明的季节,这是 黑暗的季节,那是希望的春天,那是生命的冬天 绝望,我们拥有一切,我们一无所有,我们 我们都直接去天堂,我们都直接去另一个 对

样本输出

age 2
all 2
before 2
belief 1
best 1
darkness 1
despair 1
direct 2
epoch 2
everything 1
foolishness 1
going 2
had 2
heaven 1
hope 1
incredulity 1
it 10
light 1
nothing 1
of 10
other 1
season 2
spring 1
the 11
times 2
to 1
us 2
was 10
way 1
we 4
were 2
winter 1
wisdom 1
worst 1
这是我现在的代码:

总而言之,c:

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

int main()
{
    char wordcollected [3100] = {0};
    char *word_ptr[100];
    int countarray[100];
    static char temp[31];
    int nth_word = 0;
    while(1){
        int n = strlen(wordcollected);
        word_ptr [nth_word] = wordcollected + strlen(wordcollected);
        if(strcpy(temp, fetch_word()) == NULL){
            for(n == strlen(wordcollected); n >= 0; n--){
            if(wordcollected[n] == ','){
                wordcollected[n] = '\0';
            }
        }
            break;
        }
        strcat((wordcollected), temp);
        strcat((wordcollected), ",");
        nth_word ++;
    }

}

函数*fetch_word()在运行时将返回指向stdin中每个单词的指针,如果函数已经到达文件末尾,则还将返回NULL。但每次当它到达EOF时,它只是不断地说分段故障,系统就停止了。如何检测fetch_word()的返回值,知道何时到达文件末尾,并防止丢失任何单词?

在循环之前,您需要在结束符号处断开:

    if(strcpy(temp, fetch_word()) == NULL){
        break;
        for(n == strlen(wordcollected); n >= 0; n--){
        if(wordcollected[n] == ','){
            wordcollected[n] = '\0';
        }
    }
    }
但请接受我的建议,重构代码,使其更具可读性。那样你会节省很多时间


此外,在算法上,对我来说,您可能希望创建一个单词的链表,并与一个数字配对(实现链表数据结构以实现这一点),每当您阅读一个单词时,尝试在链表中找到它,直到您达到低于字母顺序的单词或列表末尾,或匹配。如果找到匹配项,请在数字上加1。否则,请在其相应位置插入值为1的单词。

要获取单词,可以使用以下fetch_words()

#包括
#包括
#包括
无效打印字(常量字符*字,无效*参数)
{
printf(“[Word]\n”,Word);
}
/*
*@fp文件指针
*@func调用函数,其中有两个参数(字、参数)
*@arg func的第二个参数
* */
void fetch_字(文件*fp,void(*func)(常量字符*,void*),void*arg)
{
字符区域[256]={0};
字符buff[128];
int size=sizeof(buff)-1;
char*delim=“\t\n,.;:?(){}\”;
字符*最后;
字符*令牌;
内伦;
char*pos;
while(fgets(buff,size,fp)!=NULL)
{
/*将部分buff附加到区域中*/
len=尺寸-strlen(面积);
strncat(面积、浅黄色、浅黄色);
pos=面积+strlen(面积);
/*在区域中拆分字符串*/
if((令牌=strtok(区域,delim))!=NULL)
{
最后=令牌;
while((token=strtok(NULL,delim))!=NULL)
{
func(最后一个参数);
最后=令牌;
}
如果(最后一个+strlen(最后一个)=位置)
{
/*将最后一个令牌复制到区域中*/
strcpy(区域,最后一个);
}
其他的
{
/*洁净区*/
面积[0]=0;
func(最后一个参数);
last=NULL;
}
}
/*将buff的左侧部分附加到下一个循环的区域中*/
if(len
对于单词计数,您可以使用hashmap(KeyValue)。Key是单词,而Value是单词计数

下面是用C实现hashmap的一个简单方法:

和这个作业一样。
#ifndef __FUNCTION_H__
#define __FUNCTION_H__

// fetch words from stdin
const char *fetch_word() ;

#endif
    if(strcpy(temp, fetch_word()) == NULL){
        break;
        for(n == strlen(wordcollected); n >= 0; n--){
        if(wordcollected[n] == ','){
            wordcollected[n] = '\0';
        }
    }
    }
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void print_word(const char *word, void *arg)
{
    printf("[Word] <%s>\n", word);
}

/*
 * @fp   file pointer
 * @func recall function whch has two params (word, arg)
 * @arg  the second param of func
 * */
void fetch_words(FILE *fp, void (*func)(const char *, void *), void *arg)
{
    char area[256] = {0};
    char buff[128];
    int size = sizeof(buff) - 1;
    char *delim = " \t\n,.;:?(){}\"'";
    char *last;
    char *token;
    int len;
    char *pos;

    while (fgets(buff, size, fp) != NULL)
    {
        /* Append part of buff into area */
        len = size - strlen(area);
        strncat(area, buff, len);
        pos = area + strlen(area);

        /* Split string in area */
        if ((token = strtok(area, delim)) != NULL)
        {
            last = token;
            while ((token = strtok(NULL, delim)) != NULL)
            {
                func(last, arg);
                last = token;
            }

            if (last + strlen(last) == pos)
            {
                /* Copy last token into area  */
                strcpy(area, last);
            }
            else
            {
                /* Clean area */
                area[0] = 0;
                func(last, arg);
                last = NULL;
            }
        }

        /* Append left part of buff into area for next loop */
        if (len < strlen(buff))
        {
            strcat(area, buff + len);
        }
    }

    if (last)
    {
        func(last, arg);
    }

}

int main(int argc, char *argv)
{
    fetch_words(stdin, print_word, NULL);

    return 0;
}