C语言 统计文件中各个单词的个数
发布网友
发布时间:2022-10-30 06:36
我来回答
共3个回答
热心网友
时间:2023-10-10 21:51
你的程序只需要修改两处就行了:(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;
}
明白了吗?
热心网友
时间:2023-10-10 21:51
我只是把int main改为void main了,调试是可以运行的 啊追问可以运行,但结果是错的,我想把不重复的单词放入指针数组s2中,但结果只输出最后一个单词。
追答那是算法了,我*为力了,我只是改错哈,主要是看别人的代码有点不习惯,相信你再看一遍代码,修改下算法肯定可以的啊!
热心网友
时间:2023-10-10 21:52
/************************************************
************************************************/
#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
************************************************/