wc.exe是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有的wc.exe的功能,并加以扩充,给出某程序设计源语言文件的字符数、单词数和行数。

给实现一个统计程序,它能正确统计程序文件的字符数、单词数、行数,以及其他扩展功能,并能够快速的处理多个文件。

就这样,代码如下:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <io.h>
void open_file(int a,int b,int c,int d,char data[]);
FILE *letter(FILE *fp1,char ch1);
FILE *message(FILE *fp1,char ch2);
FILE *null(FILE *fp1,char ch3);
void printDir( const char* path );
char str1[],str3[];
int word_N=,line_N=,ch_N=;//记录单词数、行数、字符数
int null_h=,code_h=,mess_h=;//记录空行、代码行、注释行
int s_ch=,s_word=,s_line=,hang_a=,s_s=;//记录输入的查询数据
int main ()
{
  char s[];
  gets(s);
while()
{
  memset(str1, , sizeof(str1));
  memset(str3, , sizeof(str3));
  word_N=,line_N=,ch_N=,null_h=,code_h=,mess_h=;
  s_ch=,s_word=,s_line=,hang_a=,s_s=;
  int length_s=;
  length_s=strlen(s);
  int i=;
 for(i=;i<length_s;++i)
  {
    if((s[i]=='-')&&(s[i+]=='c'))
    {
    s_ch=;
    }
    if((s[i]=='-')&&(s[i+]=='w'))
    {
    s_word=;
    }
    if((s[i]=='-')&&(s[i+]=='l'))
    {
    s_line=;
    }
    if((s[i]=='-')&&(s[i+]=='a'))
    {
    hang_a=;
    }
    if((s[i]=='-')&&(s[i+]=='s'))
    {
    s_s=;
    }
if(s[i]=='F'){
strncpy(str1,s+i,length_s-i);
strcpy(str3,str1);
break;
}//获取文件名
}
if(s_s==)
{
  s_ch=;
  s_word=;
  s_line=;
  hang_a=;
  printDir(str1);
}
  else open_file(s_ch,s_word,s_line,hang_a,str1); printf("\n");
gets(s);
}
return ;
}
void printDir( const char* path )
{
struct _finddata_t data; long hnd = _findfirst( path, &data ); // 查找文件名与正则表达式chRE的匹配第一个文件
if ( hnd < )
{
perror( path );
}
int nRet = (hnd < ) ? - : ;
while ( nRet >= )
{
if ( data.attrib == _A_SUBDIR ) // 如果是目录
{
printf("文件名:[%s]*\n", data.name );
open_file(s_ch,s_word,s_line,hang_a,data.name );
}
else
{
printf("文件名:[%s]\n", data.name );
open_file(s_ch,s_word,s_line,hang_a,data.name);
}
nRet = _findnext( hnd, &data );
}
_findclose( hnd ); // 关闭当前句柄
}
void open_file(int a,int b,int c,int d,char data[])
{
  word_N=,line_N=,ch_N=,null_h=,code_h=,mess_h=;
  int i=,length_str3=,j=;
  length_str3=strlen(str3);
  char str2[];
  memset(str1, , sizeof(str1));
  strcpy(str1,str3);
  for(i=;i<length_str3;++i)
    {
    if(str3[]==data[])
    {
      strcpy(str2,str3);
      break;
    }//当未输入指令-s时,直接打开str1
    else if(str3[i]=='*')
    {
      for(;i<length_str3;++i)
      str1[i]='\0';
      strcat(str1,data);
      printf("文件位置:%s\n", str1);
      strcpy(str2,str1);
      break;
    }
}
FILE *fp;
fp=fopen(str2,"r");
if(fp==NULL){
printf("the file not found\n");
exit();
}//打开地址文件
char ch;
ch=fgetc(fp);
ch_N++;
if(ch==EOF)
ch_N--;
while(ch!=EOF)
{
  switch(ch)
  {
    case ' ':fp=null(fp,ch);break;
    case '{':fp=null(fp,ch);break;
    case '}':fp=null(fp,ch);break;
    case '/': fp=message(fp,ch);break;
    default :fp=letter(fp,ch);break;
  }
  ch=fgetc(fp);
  ch_N++;
  if(ch==EOF)
  ch_N--;
}   if(a==)
    printf("字符数:%d\n",ch_N);
  if(b==)
    printf("单词数:%d\n",word_N);
  if(c==)
    printf("总行数:%d\n",line_N);
  if(d==)
  {
    printf("代码行:%d\n",code_h);
    printf("注释行:%d\n",mess_h);
    printf("空行:%d\n",null_h);
  }
}
FILE *message(FILE *fp1,char ch2)
{
  char ch_2;
  ch_2=fgetc(fp1);
  ch_N++;
  if(ch_2=='/')
  {
    ch_2=fgetc(fp1);
    ch_N++;
  while((ch_2!='\n')&&(ch_2!=EOF))
  {
    ch_2=fgetc(fp1);
    ch_N++;
  }//换行时输出
  ch_2=fgetc(fp1);
  ch_N++;
  mess_h++;
  line_N++;//注释行+1,总行数+1,获取\n之后的下一个字符;
  if(ch_2==EOF)
  {
    ch_N--;
  return fp1;
  }
}
  fseek(fp1,-,);
  ch_N--;
return fp1;
}//注释函数
FILE *null(FILE *fp1,char ch3)
{
  char ch_3;
  ch_3=ch3; if((ch_3=='{')||(ch_3=='}'))
  {
    ch_3=fgetc(fp1);
    ch_N++;
if(ch_3=='\n')
  {
    null_h++;
    line_N++;
    ch_3=fgetc(fp1);
    ch_N++;
  }
}
if(ch_3==EOF)
  {
    ch_N--;
    null_h++;
    line_N++;
    return fp1;
} while((ch_3==' '))
{
  ch_3=fgetc(fp1);
  ch_N++;
}
if(ch_3=='\n')
{
  null_h++;
  line_N++;
  ch_3=fgetc(fp1);
  ch_N++;
}
  fseek(fp1,-,);
  ch_N--;
  return fp1;
}//空行函数
  FILE *letter(FILE *fp1,char ch1)
  {
    char ch_1;
    ch_1=ch1;
  if(isalpha(ch_1))
   {
    ch_1=fgetc(fp1);
    ch_N++;
  while((isalpha(ch_1))||(isdigit(ch_1)))
   {
    ch_1=fgetc(fp1);
    ch_N++;
   }
    word_N++;
   }//字母型单词
    else if(isdigit(ch_1))
    {
      ch_1=fgetc(fp1);
      ch_N++;
    while((isdigit(ch_1))||(isalpha(ch_1)))
    {
      ch_1=fgetc(fp1);
      ch_N++;
    }
      word_N++;}//数字型单词
    else if(ch_1=='\n')
    {
      code_h++;
      line_N++;
      ch_1=fgetc(fp1);
      ch_N++;
    }
    else if(ch_1==EOF)
    {
      ch_N--;
      return fp1;
     }
    else
    {
      ch_1=fgetc(fp1);
      ch_N++;
    }
     fseek(fp1,-,);
     ch_N--;
     return fp1;
  }

实践最简单的项目:WC的更多相关文章

  1. 实践简单的项目WC

    #include<iostream> #include<fstream> #include<string> #include<Windows.h> us ...

  2. 个人项目-wc

    个人项目-WC   (C语言) 一.Github地址:https://github.com/Lin-J-F/WC 二.PSP表格 PSP2.1 Personal Software Process St ...

  3. Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt)

    Django 1.6 最佳实践: 如何设置django项目的设置(settings.py)和部署文件(requirements.txt) 作者: Desmond Chen,发布日期: 2014-05- ...

  4. OK 开始实践书上的项目一:即使标记

    OK 开始实践书上的项目一:及时标记 然而....又得往前面看啦! ----------------------我是分割线------------------------ 代码改变世界

  5. 简单vue项目脚手架(vue+webpack2.0+vuex+vue-router)

    github地址 使用技术栈 webpack(^2.6.1) webpack-dev-server(^2.4.5) vue(^2.3.3) vuex(^2.3.1) vue-router(^2.5.3 ...

  6. Intellij创建简单Springboot项目

    Intellij创建简单Springboot项目 第一步:选择创建新项目——file-new-project 第二步:选择项目类型——Spring Initializr-next 第三步:输入项目信息 ...

  7. Hibernate入门2.简单的项目开发实例

    Hibernate入门2.简单的项目开发实例 这一节通过一个简单的项目学习Hibernate项目的配置 代码下载 : 链接: http://pan.baidu.com/s/1zlgjl 密码: p34 ...

  8. Ant—使用Ant构建简单Java项目(三)

    博客<Ant-使用Ant构建简单Java项目(二)>我们简化了运行Test类中main方法须要运行的命令,本博客来介绍一下如何使build.xml文件和当中使用property标签定义的属 ...

  9. javaWEB简单商城项目

    javaWEB简单商城项目(一) 项目中使用到了上一篇博文的分页框架,还有mybatis,重点是学习mybatis.现在有些小迷茫,不知道该干啥,唉,不想那么多了,学就对了 一.项目功能结构 1.功能 ...

随机推荐

  1. 在Web大作业——红十字会管理系统里出现的一个Error

    工程描述:根据用户在前端网页的操作对后台数据库进行查询或更新. 错误描述:当对网页进行多次操作后,网页会报错:“数据库超过最大连接数”. 错误分析:每次打开某一网页,都会运行一段JAVA代码连接数据库 ...

  2. 无法将文件" "复制到“bin\*.*”。对路径“bin\*.*”的访问被拒绝。 解决方法

    如果没有特别什么代码的错误,而是更新了某个自动获取的Webserive 那么什么都不用管,直接VS关闭,从新打开就好了.

  3. 黑马-----内存模型和volatile详解

    黑马程序员:Java培训.Android培训.iOS培训..Net培训 JAVA线程-内存模型和volatile详解 一.单核内存模型 1.程序运行时,将临时数据存放到Cache中 2.将CPU计算所 ...

  4. track by

    ng-repeat指令中使用track by子语句解决重复数据遍历的错误 <li ng-repat="x in [2, 2]" ng-bind="x"&g ...

  5. WPF学习笔记——依赖属性(Dependency Property)

    1.什么是依赖属性 依赖属性是一种可以自己没有值,并且通过Binding从数据源获得值(依赖在别人身上)的属性,拥有依赖属性的对象被称为"依赖对象". 依赖项属性通过调用 Regi ...

  6. HTTP、FTP状态码 (share)

    来源:http://www.cnblogs.com/setsail/archive/2012/03/23/2413577.html HTTP1xx - 信息提示(这些状态代码表示临时的响应.客户端在收 ...

  7. (转)Spring AOP实现方式(转)

    我们可以通过三种方式来使用Spring AOP,它们分别是:@Aspect-based(Annotation),Schema-based(XML),以及底层的Spring AOP API 底层的Spr ...

  8. iOS 按钮点击变色

    之前一直以为是要在selected状态下增加一个背景图片,效果是颜色变深,明明我的图片是变浅: 之后试了用hightlighted 成功. [_loginBtn setBackgroundImage: ...

  9. angular2 - content projection-

    angular2中的内容映射: App.component: <my-day> <my-lucky> </my-lucky> </my-day> MyD ...

  10. Linux下高cpu解决方案(转载)

    昨天搞定了一个十万火急的issue,客户抱怨产品升级后系统会变慢和CPU使用率相当高,客户脾气很大,声称不尽快解决这个问题就退货,弄得我们 R&D压力很大,解决这个issue的任务分给了我,客 ...