C语言 统计文件中各个单词的个数

编程实现输入一串英文,统计其中各单词出现的个数(不区分大小写字母),以“000”作为字符串输入结束标志,例如:Twinkletwinklelittlestar000(回车... 编程实现输入一串英文,统计其中各单词出现的个数(不区分大小写字母),以“000”作为字符串输入结束标志,例如:

Twinkle twinkle little star 000(回车)
twinkle little star
2 1 1
((这一学期刚学C语言,课后题如上,我的代码如下,总是出错,也不知道为什么,刚学到指针,请高手帮我找一下错误,若错误太多无法更正,就请附上您的代码,谢谢了。))
#include<stdio.h>
#include<string.h>

int main()
{
char str[100],ch;
char *s2[30]; /*s2存放单词(不重复)*/
char s3[30],*p=s3;
int i,j,k=0,flag1,flag2,count1=0,white=1,a[30]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
FILE *file;
file=fopen("string.txt","w+");
printf("Input a string of English:\n");
gets(str);
fputs(str,file);

rewind(file);
while((ch=fgetc(file))!='0') /*统计文件中有多少个单词*/
{
if((ch==' ')||(ch=='\t')||(ch=='\n'))
white++;
else
{
if(white)
{
white=0;
count1++;
}
}
}

rewind(file);
for(i=0;i<count1;i++)
{
flag1=0; /*是否有重复单词*/
flag2=0; /*是否遇到空白字符*/
p=s3;
while(ch=fgetc(file))
{
if((ch!=' ')&&(ch!='\t')&&(ch!='0'))
{
if((ch>64)&&(ch<91)) /*大写字母变小写*/
{
ch=ch+32;
}
*p++=ch;
}
else
{
flag2=1; /*遇到空白字符*/
*p='\0';
for(j=0;j<k;j++) /*k为s2中的单词个数*/
{
if(strcmp(s3,s2[j])==0)
{
flag1=1; /*有重复单词*/
a[j]++;
break;
}
}
if(flag1==0) /*如果单词不重复*/
{
s2[k]=s3;
a[k]++;
k++;
}
}
if(flag2==1) /*如果遇到空白字符,则开始查询下一单词,跳出while循环*/
{
break;
}
}
while(((ch=fgetc(file))==' ')||(ch=='\t')); /*吞掉多余的空白字符*/
fseek(file,-1,1); /*后退一格,继续读*/
}
for(i=0;i<k;i++)
{
printf("%s\t",s2[i]);
}
printf("\n");
for(i=0;i<k;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
fclose(file);
return 0;
}
展开
 我来答
vmyflst
推荐于2017-12-15 · TA获得超过256个赞
知道答主
回答量:26
采纳率:0%
帮助的人:26.5万
展开全部
你的程序只需要修改两处就行了:(1.)不能用指针数组直接存放字符串,即,要把程序开头的char *s2[30]改为char s2[30][30],用二维数组来存放多个字符串;(2.)你的想法是,如果单词不是重复的单词,就将它存入s2,但这时不能用“=”,应该用strcpy()函数,即,原程序中的s2[k]=s3应改为strcpy(s2[k],s3),改过后的代码如下:
#include<stdio.h>
#include<string.h>

int main()
{
char str[100],ch;
char s2[30][30]; /*s2存放单词(不重复),修改处*/
char s3[30],*p=s3;
int i,j,k=0,flag1,flag2,count1=0,white=1,a[30]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
FILE *file;
file=fopen("string.txt","w+");
printf("Input a string of English:\n");
gets(str);
fputs(str,file);

rewind(file);
while((ch=fgetc(file))!='0') /*统计文件中有多少个单词*/
{
if((ch==' ')||(ch=='\t')||(ch=='\n'))
white++;
else
{
if(white)
{
white=0;
count1++;
}
}
}

rewind(file);
for(i=0;i<count1;i++)
{
flag1=0; /*是否有重复单词*/
flag2=0; /*是否遇到空白字符*/
p=s3;
while(ch=fgetc(file))
{
if((ch!=' ')&&(ch!='\t')&&(ch!='0'))
{
if((ch>64)&&(ch<91)) /*大写字母变小写*/
{
ch=ch+32;
}
*p++=ch;
}
else
{
flag2=1; /*遇到空白字符*/
*p='\0';
for(j=0;j<k;j++) /*k为s2中的单词个数*/
{
if(strcmp(s3,s2[j])==0)
{
flag1=1; /*有重复单词*/
a[j]++;
break;
}
}
if(flag1==0) /*如果单词不重复*/
{
strcpy(s2[k],s3); /*修改处*/
a[k]++;
k++;
}
}
if(flag2==1) /*如果遇到空白字符,则开始查询下一单词,跳出while循环*/
{
break;
}
}
while(((ch=fgetc(file))==' ')||(ch=='\t')); /*吞掉多余的空白字符*/
fseek(file,-1,1); /*后退一格,继续读*/
}
for(i=0;i<k;i++)
{
printf("%s\t",s2[i]);
}
printf("\n");
for(i=0;i<k;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
fclose(file);
return 0;
}

明白了吗?
youlixishi1
2011-10-28 · TA获得超过128个赞
知道小有建树答主
回答量:150
采纳率:0%
帮助的人:129万
展开全部
我只是把int main改为void main了,调试是可以运行的 啊
追问
可以运行,但结果是错的,我想把不重复的单词放入指针数组s2中,但结果只输出最后一个单词。
追答
那是算法了,我无能为力了,我只是改错哈,主要是看别人的代码有点不习惯,相信你再看一遍代码,修改下算法肯定可以的啊!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wuzhi3078
2011-10-29 · TA获得超过123个赞
知道小有建树答主
回答量:159
采纳率:0%
帮助的人:216万
展开全部
/************************************************

************************************************/

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

#define WORDLEN 30
int BuildDictionary(char*[]);
void FindWord(char *, int[],char *s2[], int len);
char JudgeWord(char);

void main()
{
char *s2[WORDLEN], line[100];
char word[WORDLEN], *p;
int i, len,lenword, how[WORDLEN];

for (i=0; i<WORDLEN; i++){
s2[i] = (char *)malloc(WORDLEN);
}
memset(how, 0, sizeof(how));
//构建词典,从文件读入,必须每个单词用空格隔开且小写
lenword = BuildDictionary(s2);
printf("词典已读入,请输入字符串:");
//输出一串字符,回车结束
gets(line);
FindWord(line, how, s2, lenword);
//输出单词统计结果
for (i=0;i<WORDLEN;i++)
if(how[i])printf("%-10s ",s2[i]);
printf("\n");
for (i=0;i<WORDLEN;i++)
if(how[i])printf("%-10d ",how[i]);
printf("\n");
}

int BuildDictionary(char*p[])
{
FILE *fp;
int i = 0;

if((fp=fopen("dic.txt","r"))==NULL){
printf("Open dic.txt file Err\n");
return 0;
}
while (fscanf(fp, "%s", p[i]) != EOF){
i++;
if(i>=WORDLEN)break;
}
return i;
}
/************************************************/

void FindWord(char *p,int how[], char *s2[], int len)
{
int i = 0, j;
char c, WORD[WORDLEN];

while (*p)
{
if(JudgeWord(*p)!='#')
{
i = 0;
while (*p)
{
if ((c=JudgeWord(*p)) != '#'){
WORD[i++]=c;p++;
}
else
break;
}
WORD[i]='\0';
for (j=0; j<len;j++)
{
if(strcmp(s2[j], WORD) == 0){
how[j]++; break;
}
}
}
p++;
}
}

/************************************************/
char JudgeWord(char c){
if(c>='A'&&c<='Z')
return c+32;
else if(c>='a' && c<='z')
return c;
else
return '#';
}

/************************************************
结果测试:
词典已读入,请输入字符串:Twinkle twinkle little star 000
twinkle little star
2 1 1

************************************************/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式