如何用c语言完成统计一个句子中每个单词出现的次数啊?是用c语言,不要用c++,谢谢大家了

输入要求:若干个以空格分割的单词序列,单词的总数不超过1000个,每个单词的长度不超过20个英文字符,这里单词不区分大小写,例如 Hello与hELLo被认为是相同的单词。
例如
【输入示例】 Hello world welcome English hello word World HELLO english hELLo

【输出示例】
English 2
Hello 4
Welcome 1
Word 1
World 2
补充一下,我用的是vc6,所以要在vc6上通过才可以的,还有打开txt的这种形式没法通过我们的测评系统,所以请大家写成直接输入字符串的那种形式,而不要把输入的东西放进txt文件中,谢谢大家了

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <string.h>

typedef struct Word {

 char w[20];

 int  k;

 struct Word *next;

}pWord;

int main(int argc, char *argv[])

{

 FILE *fp = fopen("input.txt","r");

 struct Word *Head = NULL;

 while (!feof(fp)) {

  char *p = (char *)malloc(20*sizeof(char));

  fscanf(fp, "%s", p);

  if(Head == NULL){

   struct Word *temp = (struct Word *)malloc(sizeof(struct Word));

   strcpy(temp->w, p);

   temp->k = 1;

   temp->next = NULL;

   Head = temp;

  } else {

   struct Word *pp = Head;

   while (pp != NULL) {

    if (strcasecmp( pp->w, p) == 0){

     ++pp->k;

     break;

    } else {

     pp = pp->next;

    }

   }

   if (pp == NULL){

    struct Word *temp = (struct Word *)malloc(sizeof(struct Word));

    strcpy(temp->w, p);

    temp->k = 1;

    temp->next = Head;

    Head = temp;

   }

  }

 }

 struct Word *q = Head;

 while (q != NULL) {

  printf("%s    ", q->w);

  printf("%d\n", q->k);

  q = q->next;

 }

 return 0;

}   /*------end of main------*

我是把要读写的东西放进了一个input.txt中 这样好读写一下 你看看行不行吧

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-16
这种统计单词出现的频率类的题目最好用HashTable 做,楼主可以参考一下的这个。
http://wgli978.blog.163.com/blog/static/1359287722010010114617437/
第2个回答  2020-07-16
/*
输入要求:若干个以空格分割的单词序列,单词的总数不超过1000个,每个单词的长度不超过20个英文字符,这里单词不区分大小写,例如 Hello与hELLo被认为是相同的单词。
例如
【输入示例】 Hello world welcome English hello word World HELLO english hELLo
【输出示例】
English 2
Hello 4
Welcome 1
Word 1
World 2
附:
函数名: strncmpi
功 能: 将一个串中的一部分与另一个串比较, 不管大小写
用 法: int strncmpi(char *str1, char *str2, unsigned maxlen);
*/
#include <stdio.h>
#include <string.h>
#define M 1000
#define N 20
main()
{
char str1[M][N];//单词字串结果存放数组
char str2[M];//输入串.或者用char *str2也可,这样可以
//无视长度限制
int strC[M];//单词字串计数数组.对应每个单词串,拥有一个计算器
int i=0,j=0,k=0,t=0,x=0;
gets(str2);//接受行输入
t=strlen(str2)+1;//计算该行中总字符数
printf("输入字串为:%s\n",str2);
while(j<t)
{
for(;str2[j]==32;j++);//如果串中是空格,则拼命跳过,不计
while(k<N&&str2[j]!=32) //不是空格,且没有超出题目中的要求:
//每个字串长度小于20.如果大于20,自动截除.
//必要时可以调整N的值来重定义长大
str1[i][k++]=str2[j++]; //将输入行字串分割存放到结果数组中
str1[i][k]='\0'; //如果该串原来大于20,会被自动截除
strC[i]=1; //计数
for(x=0;x<i;x++) //与前面的串比较
if(strncmpi(str1[i],str1[x],N)==0)
//调用库函数,不分大小写与前面的串相比,相同则返回0.
{
strC[x]++; //相同,计数器数组增加
i--; //该串为重复串,总串数不增加
break; //跳出for循环
}
i++; //无重复串,则总字串数增加
k=0;
}
printf("结果:\n");
t=0;
for(;t<i;t++)//不超出总串数
printf("%s,%d\n",str1[t],strC[t]);
}

/*测试结果:
输入: aa bb cc heloo HElloo AA CC AA dd BBB bb ee fff ddfdsf
结果:
aa,3
bb,2
cc,2
heloo,1
HElloo,1
dd,1
BBB,1
ee,1
fff,1
ddfdsf,1
*/

//注意:本程序中所有//注释在TC2.0或某些编译器将无法通过编译,
//请删除所有"//"注释即可