040.文件的字数统计程序

简介: 040.文件的字数统计程序
/*
该程序实现统计一个或多个文件的行数、字数和字符数。
一个行由一个换行符限定,一个字由空格分隔(包括空白符、制表符和换行符),
字符是指文件中的所有字符。要求程序另设三个任选的参数,
让用户指定他所要的统计。它们是:
1 统计文件行数
w 统计文件字数
c 统计文件字符数
若用户未指定任选的参数,则表示三个统计都要。
运行本程序时的参数按一下格式给出:
-l -w -c 文件 文件 ... 文件
其中,前三个任选参数l、w、c的出现与否和出现顺序任意,
或任意组合在一起出现,如:-lwc,-cwl,-lw,-wl,-lc,-cl,-cw等。
*/
#include <stdio.h>
main(int argc, char **argv )
{
  FILE *fp;
  int lflg,wflg,cflg; /* l, w, c三个标志 */
  int inline,inword; /* 行内和字内标志 */
  int ccount,wcount,lcount; /* 字符,字,行 计数器 */
  int c;
  char *s;
  lflg=wflg=cflg=0;
  if(argc<2)
  {
    printf("To run this program, usage: program -l -w -c file1 file2 ... filen \n");
    exit(0);
  }
  while(--argc>=1&&(*++argv)[0]=='-')
  {
    for(s=argv[0]+1;*s!='\0';s++)
    {
      switch(*s)
      {
        case 'l': 
          lflg=1;
          break;
        case 'w':
          wflg=1;
          break;
        case 'c':
          cflg=1;
          break;
        default:
          puts("To run this program, usage: program -l -w -c file1 file2 ... filen");
          exit(0);
      }
    }
  }
  if(lflg==0&&wflg==0&&cflg==0)
    lflg=wflg=cflg=1;
  lcount=wcount=ccount=0;
  while(--argc>=0)
  {
    if((fp=fopen(*argv++,"r"))==NULL) /* 以只读方式打开文件 */
    {
      fprintf(stderr,"Can't open %s.\n",*argv);
      continue;
    }
    inword=inline=0;
    while((c=fgetc(fp))!=EOF)
    {
      if(cflg)
        ccount++;
      if(wflg)
        if(c=='\n'||c==' '||c=='\t')
          inword=0;
        else if(inword==0)
        {
          wcount++;
          inword=1;
        }
      if(lflg)
        if(c=='\n')
          inline=0;
        else if(inline==0)
        {
          lcount++;
          inline=1;
        }
    }
    fclose(fp); /* 关闭文件 */
  }
  if(lflg)
    printf(" Lines =         %d\n",lcount);
  if(wflg)
    printf(" Words =         %d\n",wcount);
  if(cflg)
    printf(" Characters =    %d\n",ccount);
}
相关文章
EndNote参考文献显示中国作者名的第二个字的首字母的方法
本文介绍利用EndNote软件,对论文参考文献中英文文献的汉语拼音姓名(即含有中国作者的英文论文)的名的第二个字的首写字母加以补充显示~
645 1
EndNote参考文献显示中国作者名的第二个字的首字母的方法
|
5月前
|
传感器 物联网 Linux
Python:蓝牙心率广播设备监测(BLE 心率监测器)技术解析与实现
本文探讨了如何使用 Python 脚本与支持蓝牙低功耗(BLE)心率广播的设备交互以获取实时心率数据。重点分析了 BLE 协议、GATT 服务模型,以及具体方法。此外,还讨论了华为手表等设备的兼容性问题。
862 19
|
12月前
|
存储 运维 搜索推荐
|
11月前
|
Python
Python正则
【10月更文挑战第19天】
64 2
Python正则
|
监控 Kubernetes 网络协议
上云业务的k8s容器排障与思考
本文主要讲述了在完成业务上云后,面临因业务请求量激增导致的系统复杂故障和挑战。作者通过排查分析,发现了一个长时间处于“进行中”状态的异常任务,客户端(APP2)进程卡死,而服务端(APP3)进程正常结束。进一步分析发现,问题出在kube-proxy代理的会话超时机制,由于请求处理延迟,kube-proxy清理了会话记录,导致服务端回包异常,客户端无法识别,从而形成进程假死。 最后,作者强调了在成本控制背景下,通过分析流量增长原因、优化技术架构和调整运营策略来改善系统性能和稳定性的必要性。
750 5
上云业务的k8s容器排障与思考
|
jenkins Java 持续交付
【一键搞定!】Jenkins 自动发布 Java 代码的神奇之旅 —— 从零到英雄的持续集成/部署实战秘籍!
【8月更文挑战第9天】随着软件开发自动化的发展,持续集成(CI)与持续部署(CD)已成为现代流程的核心。Jenkins 作为一款灵活且功能丰富的开源 CI/CD 工具,在业界应用广泛。以一家电商公司的 Java 后端服务为例,通过搭建 Jenkins 自动化发布流程,包括创建 Jenkins 项目、配置 Git 仓库、设置构建触发器以及编写构建脚本等步骤,可以实现代码的快速可靠部署。
460 2
|
JSON 开发框架 API
【推荐100个unity插件之20】一个强大的JSON处理库——Newtonsoft.Json(也称为Json.NET)
【推荐100个unity插件之20】一个强大的JSON处理库——Newtonsoft.Json(也称为Json.NET)
1176 0
|
存储 NoSQL Java
mongodb基于地理位置查询实现围栏
mongodb基于地理位置查询实现围栏
1749 0
|
算法 Java Go
掌握Go的内存管理机制:垃圾回收与内存泄漏
掌握Go的内存管理机制:垃圾回收与内存泄漏
207 0