编码用命令行执行的C语言词语统计程序
需求介绍
程序处理用户需求的模式为:
- wc.exe [parameter][filename]
在[parameter]中,用户通过输入参数与程序交互,需实现的功能如下:
1、基本功能
- 支持 -c 统计文件字符数
- 支持 -w 统计文件单词数
- 支持 -l 统计文件总行数
2、拓展功能
- 支持 -a 返回高级选项(代码行 空行 注释行)
- 支持 -s 递归处理符合条件的文件
3、高级功能
- 支持 -x 程序以图形界面与用户交互
[filename] 是待处理文件名。
设计历程及感想
初次看到这个题目,真的是一头雾水,因为以前编译代码都是用编译器直接编译的,而这次要求写一个命令行程序,于是,我找到了度娘,度娘告诉我,main函数的参数
int argc, char* argv[]可以帮到你,通过阅读相关文档,我对其有了大致了解:
argc这个整形数据用来保存后面字符串argv的空间大小,而argv则用来保存命令行的输入数据。
明白了这些,思路顿时打开了,这个题目要求的无非是从命令行向main函数里输入控制参数,从而达到按条件计数的效果
基本功能
- 支持 -c 统计文件字符数
- 支持 -w 统计文件单词数
- 支持 -l 统计文件总行数
由于时间安排不妥当,导致此次编程周期不长,所以具体功能都没有细化,下面附上代码,个人感觉最大的亮点就是命令行执行代码,话不多说,贴代码,发效果图,睡觉!
#include "stdafx.h" #include "string.h" #include "stdlib.h" void Count(char * file); int Zicount=0; int Wordcount=0; int Hangcount=0; int main(int argc, char* argv[]) //argv[1]保存指令,argv[2]保存文件路径 { FILE *fp; Count(argv[2]); while(1) { if((fp=fopen(argv[2],"r"))==NULL) { printf("该文件不存在!\n\n\n"); scanf("%s%s%s",argv[0],argv[1],argv[2]); continue; } else if(strcmp(argv[1],"-c")==0) //统计文件字符数 printf("文件%s字符数为:%d\n",argv[2],Zicount); else if(strcmp(argv[1],"-w")==0) //统计文件单词数 printf("文件%s单词数为:%d\n",argv[2],Wordcount); else if(strcmp(argv[1],"-l")==0) //统计文字总行数 printf("文件%s总行数为%d\n",argv[2],Hangcount); // else if(strcmp(argv[1],"-a")==0) //返回高级选项 // printf("4\n"); // else if(strcmp(argv[1],"-s")==0) //递归处理符合条件的文件 // printf("5\n"); else if(strcmp(argv[1],"exit")==0) { printf("程序结束!\n"); break; } else printf("该指令不存在,请重新输入\n"); printf("\n\n"); scanf("%s%s%s",argv[0],argv[1],argv[2]); } return 0; /* char a[20]; strcpy(a,"haha.txt"); Count(a); printf("%d\n%d\n%d\n",Zicount,Wordcount,Hangcount); return 0; */ } void Count(char * file) { FILE * fp; char a; if((fp=fopen(file,"r"))==NULL) { printf("读文件失败!\n"); exit(-1); } while(!feof(fp)) { a=fgetc(fp); if(a!=' '&&a!='\n'&&a!='\t'&&a!=','&&a!='.'&&a!='!'&&a!=';'&&a!='=') Zicount++; if(a==' '||a=='\n'||a=='\t'||a==','||a=='.'||a=='!'||a=='='||a==';') { if(a=='=') //解决== Wordcount--; Wordcount++; } if(a=='\n'||a=='\t') Hangcount++; } Zicount--; //at end of the file,Zicount will add Hangcount++; //can't recognize the last line fclose(fp); }
执行效果:
感想篇
通过写这个命令行程序,我意识到以前接触的东西实在太少,困在一个小圈子里不敢出去,以后必须去接触更多的东西,切不可坐井观天。