C语言统计一个英文文本文件中26个英文字母出现次数并按英文字母序输出统计结果

GrowdY 2018-03-25 09:14:10
#include<stdio.h>

void hello(char one, FILE*fp )
{
char letter;
int num=0;
while(!feof(fp)){
if(letter==one)num++;
fscanf(fp, "%c", &letter);
}
printf("%c:%d ", one, num);

return ;
}

int main()
{
FILE *fp;
if((fp=fopen("english.txt", "r"))==NULL){
printf("Cannot open the file!\n");
exit(0);
}

char str[26];
int i=0;
str[0]='a';

for (i=0; i<26; i++){
str[i+1]=str[i]+1;
// printf("str[%d]=%c ", i, str[i]);
hello(str[i], fp);
rewind(fp);
}
fclose(fp);

return 0;
}





求助为什么运行结果b的次数是2呢???我调试发现文本的最后一个字母进入函数时总会多一次循环,有没有大神帮忙解答下,非常感谢
...全文
3664 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
六道佩恩 2019-05-05
  • 打赏
  • 举报
回复

#include "stdio.h"
int main( void )
{
	FILE *p = fopen("1.txt","r");
	int c=0,i=0;
	int ch[256]={0};
	while( (c=fgetc(p)) != EOF)
		ch[c]++;				//256种字节值都记录下来 
	fclose(p);
	
	for( i=0 ; i<256 ; i++ )	//遍历256种字节值的个数 
		if( (i>='A'&&i<='Z') || (i>='a'&&i<='z') )	//是字母就输出 
			printf("%c:%d\n", i, ch[i] );
	return 0;
}
没有运行验证,不过应该是没问题的
qq_43371125 2019-05-04
  • 打赏
  • 举报
回复
letter不知道吧,怎么if的呀
qq_43371125 2019-05-04
  • 打赏
  • 举报
回复
为什么我根本打不开文件
magic-ice 2018-03-27
  • 打赏
  • 举报
回复
用hash映射就不会出现这个问题了吧
AlbertS 2018-03-27
  • 打赏
  • 举报
回复
str[i+1]=str[i]+1; 这一句会越界吧
自信男孩 2018-03-26
  • 打赏
  • 举报
回复
#include<stdio.h>

void hello(char one, FILE*fp )
{
    char letter;
    int num=0, ret;
    while(!feof(fp)){
        if(letter==one)
            num++;
#if 0
        fscanf(fp, "%c", &letter);
#else
        ret = fscanf(fp, "%c", &letter);
        if (ret == EOF)
            break;
#endif
    }
    printf("%c:%d  ", one, num);

    return ;
}

int main()
{
    FILE *fp;
    if((fp=fopen("english.txt", "r"))==NULL){
        printf("Cannot open the file!\n");
        //exit(0);
        return -1;
    }

    char str[26];
    int i=0;
    str[0]='a';

    for (i=0; i<26; i++){
        //str[i+1]=str[i]+1;
        str[i] = 'a' + i;
        // printf("str[%d]=%c ", i, str[i]);
        hello(str[i], fp);
        rewind(fp);
    }
    fclose(fp);

    return 0;
}
参考一下吧
 str[i+1]=str[i]+1;
这条语句str越界,因为当i为25时,str[i+1]下表就是26,因为str[26]的下表是从0~25. 由于feof本身在判断文件末尾时会有一些小问题,建议从网上查一下feof,建议使用:
ret = fscanf(fp, "%c", &letter);
        if (ret == EOF)
            break;
三生翰旋醉梦 2018-03-25
  • 打赏
  • 举报
回复
说一下个人使用DEVC++的经历,以前使用DEVC++调试,特别是打断点,走到断点处总是出现各种奇怪的问题,但是去掉断点一次行跑到system("pause")就没问题。DEVC++已经不更新了,建议使用Codeblocks,vc/vs
GrowdY 2018-03-25
  • 打赏
  • 举报
回复
我用的是DEVC++
三生翰旋醉梦 2018-03-25
  • 打赏
  • 举报
回复
你用的什么编译器,我在VC6.0下正常,没有错误。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧