计算一篇英文文章不同字母符号个数并输出,并把所有单词的首字母改成大写后输出

 

 

本来想着在运行框手动输入文章,然而思考了一段时间,这样太麻烦了。于是想起C语言打开本地文件!但是会用到文件流等方面的知识!估计要理解花不少时间!

文件在进行读写操作之前要先打开,使用完毕要关闭。

根据实例,我在本地E盘根目录下新建了一个txt文件,其内容为随意输入的几个字符,然后开始初步实现打开文件!
但是由于我们计算的是字母,而上述程序是一行一行读取,所以,继续:
以字符形式读写文件时,每次可以从文件中读取一个字符,或者向文件中写入一个字符。主要使用两个函数,分别是 fgetc() 和 fputc()。
这里为了需求,我们就只了解fgetc()函数。
这个时候我们就可以放进去英文文章《friend》!
(忘记除掉中文!)
接下来主要目的就是应用我最初编写的C语言程序二(只实现计算出每个小写字母的个数),代码如下:
#include<stdio.h>
void main()
{
        char a[10000];//一篇英文文章
        char b[26];
        int s[26] = { 0 };//用于存储字符的个数
        printf("input message:\n");
        gets(a);       
        for (int x = 0; x < 26; x++)
        {
                int c = 0;//记录每个字符个数
                b[x] = x + 97;//为了让b[0]是a,b[1]是b依次类推
                for(int i=0;a!='\0';i++)
                {
                        if (b[x] == a)
                        {
                                ++c;
                                s[x] = c;
                        }
                }
                if (s[x]>=1)//只输出输入中有的字母 的个数
                {
                        printf("%c %d\n", b[x], s[x]);
                }   
        }
}

写了半天,还是不行,只能统计出a字母的个数:

经过测试,我怎么感觉是while语句出了问题,但是while语句网上,就是这么写的呀!
噢噢噢噢!突然灵光一闪,瞬间明白,此时计算了a字母的个数同时,已经把文件内容读取完毕,这个时候的ch==EOF,并没有重新从文本开始重新计数。所以,,,,百度搜索怎么把文件指针重新指向文件开头:
使用rewind(fp);
兴高采烈......
运行程序:
成功了!怎么没有z?难道边界错了?
为了检查,在data.txt文件里末尾加三个z,运行发现:这篇文章没有z,意味着这才是成功的最后一步。
回望题目,做了这么久,上述程序只是计算小写字母的计入,大写的字母还得转换成小写字母再一起输出,为了检验程序的正确性!文章简单一点:
接下来,就是把每个单词的首字母改成大写。
似乎有点儿困难,再尝试:
忽略其中各种百度的过程以及调试,反正最后是成功了,并成功新建了一个文件copy.txt:
最后的C语言代码为:
#include<stdio.h>
#include<stdlib.h>
void main()
{
        FILE *fp;
        FILE *fw;
        char ch;
        char b[26];
        int inword=1;
        int s[26] = { 0 };//用于存储字符的个数
        if( ( fp = fopen("D:\\data.txt", "rt") ) == NULL)
        {
                printf("Fail to open file:data.txt!");
                exit(0);
        }
        if( ( fw = fopen("D:\\copy.txt", "wt") ) == NULL)
        {
                printf("Fail to open file:copy.txt!");
                exit(0);
        }
        for (int x = 0; x < 26; x++)
        {
                int c = 0;                                         //记录每个字符个数
                b[x] = x + 97;                                 //为了让b[0]是a,b[1]是b依次类推......
                while((ch=fgetc(fp)) != EOF) //每次读取一个字节,直到读取完毕
                {
                        if(ch>=65 && ch<=90)
                        {
                                ch=ch+32;
                        }
                        if (b[x] == ch)
                        {
                                ++c;
                                s[x] = c;
                        }
                }
                if (s[x]>=1)                                //只输出输入中有的字母的个数
                {
                        printf("%c %d\n", b[x], s[x]);
                }
                if(b[x]!='z')
                {
                        rewind(fp);
                }
        }
        rewind(fp);   //重新调整指针
        while((ch=fgetc(fp)) != EOF)
        {
                if (inword==0)
                {
                        if(ch>='a' && ch<='z' && ch!=' ')
                        {
                                ch = ch - 32;
                                inword = 1;
                                fputc(ch,fw);
                        }
                        else
                        {
                                inword=1;
                                fputc(ch,fw);
                        }
                }
                else
                {
                        if (ch == ' ')       
                        {
                                inword = 0;
                                fputc(ch,fw);
                        }
                        else
                        {
                                fputc(ch,fw);
                        }
                }               
        }
        printf("\n");
        fclose(fp);
        fclose(fw);
}

现在才开始进入汇编!(这么点知识,弄了一天,现在已经晚上九点半了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值