wc基础功能
第一次作业
项目地址
https://gitee.com/xxlznb/WordCount
PSP
WordCount | 预估耗时(分钟) | 实际耗时 |
---|---|---|
计划 | 20 | 30 |
预估任务需要时间 | 20 | 30 |
开发 | 380 | 465 |
需求分析 | 20 | 25 |
设计文档 | 10 | 5 |
代码规范 | 10 | 5 |
具体设计 | 40 | 20 |
具体编码 | 240 | 320 |
代码复审 | 40 | 30 |
测试 | 20 | 60 |
报告 | 50 | 45 |
测试报告 | 10 | 15 |
计算工作量 | 10 | 10 |
事后总结 | 30 | 20 |
合计 | 450 | 540 |
思路
WordCount的基础功能是
统计字数
统计字数,只需要将文件中的单词一个个读取出来就行。
统计单词数
对于一个文本而言,其内容可以抽象为单词+符号,也就是说,计算符号的间隔即可
统计行数
读取文本中的换行符即可
我的开发平台为Linux,为了符合Linux的基础要求,参考书目为《UNIX环境高级编程(第三版)》
程序实现过程
程序分为两个主要步骤在主函数中我们只需要调用这两个函数
解析参数
解析参数,我把参数分为三类,短选项、长选项、文件名,
- 短参数,以
-
开始后紧跟一个字符,短参数可以叠加使用,也可以单独使用,例如-c -l -w
- 长参数,短参数在使用频繁的时候可能造成输入麻烦,因此,你可以将短参数直接写在一个
-
后,例如-c -l -w [file]
可直接简写为-clw [file]
顺序和内容都自由更改 - 文件名称,文件名称位于参数后,且如果没有参数则会报错,如果一个参数后紧跟多个文件名,则对多个文件执行同等的操作,例如
-clw [file1] [file2]
,但-o
参数除外,-o
只能指定一个文件
对于参数解析采取宽容方式
-c -c [file]
重复参数不报错。具体做法为构造一个解析链表,将解析结果存入链表中
同时将执行模式存入其中,为了节约储存空间,将模式直接放入一个
int
中,之后判断int
的位就可以知道它的模式- 短参数,以
统计内容
统计内容为了方便添加功能,将每个功能单独写一个函数,之后调用函数即可。
代码说明
void putInfo(int x)
{
if(root==NULL)
{
root=(Info*)malloc(sizeof(Info));
root->mode=x;
root->path=NULL;
root->next=NULL;
tail=root;
}
else
{
if(tail->path!=NULL)
{
tail->next=(Info*)malloc(sizeof(Info));
tail=tail->next;
tail->mode=x;
tail->path=NULL;
tail->next=NULL;
}
else
{
tail->mode=(tail->mode|x);
}
}
}
void longArg(char* arg)
{
int length=strlen(arg);
int i,x=0;
for(i=1;i<length;i++)
{
switch(arg[i])
{
case 'c':x=x|c;break;
case 'w':x=x|w;break;
case 'l':x=x|l;break;
default:
{
fprintf(stderr,"wc:error:%s of '%s'\n",strerror(EINVAL),arg);
exit(1);
}
}
}
putInfo(x);
}
void argParsing(int argc,char* argv[])
{
char* temp=NULL;
int i=1;
while(i<argc)
{
if(strcmp(argv[i],"-c")==0)
{
putInfo(c);
}
else if(strcmp(argv[i],"-w")==0)
{
putInfo(w);
}
else if(strcmp(argv[i],"-l")==0)
{
putInfo(l);
}
else if(strcmp(argv[i],"-o")==0)
{
if(i<argc-1 && argv[i+1][0]!='-')
{
outFilePath=argv[i+1];
i++;
}
else
{
fprintf(stderr,"wc:error:'-o' argument no outputfile\n");
exit(1);
}
}
else if(argv[i][0]=='-')
{
if(strlen(argv[i])>2)
{
longArg(argv[i]);
}
else
{
fprintf(stderr,"wc:error:%s of '%s'\n",strerror(EINVAL),argv[i]);
exit(1);
}
}
else
{
if(tail!=NULL)
{
if(tail->path!=NULL)
{
putInfo(tail->mode);
}
tail->path=argv[i];
}
else
{
fprintf(stderr,"wc:error:%s of '%s'\n",strerror(EINVAL),argv[i]);
exit(1);
}
}
i++;
}
if(root==NULL||tail->path==NULL)
{
fprintf(stderr,"wc:error:no input file\n");
exit(1);
}
if(outFilePath==NULL)outFilePath="result";
}
这是解析的相关函数,主要就体现一个if else
。就考虑到所有的方面就行了,代码有问题的地方在与可复用性不高,而且扩展行差。后期再想办法吧。
测试设计
创建一个test.sh
文件,内容如下:
#!/bin/bash
gcc wc.c -o wc -D PRINT -D NOCOUNT
./wc -c -c -l -w file1
./wc -clw file1 file2
./wc -clw file1 -cl file2
./wc -c
./wc file1
./wc -e file1
./wc -el file1
./wc -o
./wc -l -o outfile file
./wc -
./wc
输出内容如下
7,file1
7,file1
7,file2
7,file1
5,file2
wc:error:no input file
wc:error:Invalid argument of 'file1'
wc:error:Invalid argument of '-e'
wc:error:Invalid argument of '-el'
wc:error:'-o' argument no outputfile
1,file
wc:error:Invalid argument of '-'
wc:error:no input file
白盒测试,可能会有没考虑到的地方
参考文献
《UNIX环境高级编程(第三版)》
wc基础功能的更多相关文章
- 通过python实现wc基本功能
---恢复内容开始--- 1.Github项目地址: https://github.com/zhg1998/ww/blob/master/wc.py 2.项目相关要求: 写一个命令行程序,模仿已有wc ...
- C语言实现wc基本功能
GitHub地址:https://github.com/hhx007/wc 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数. 这个项目要求写一个命令行程序,模仿已有w ...
- [ kvm ] 学习笔记 3:KVM 基础功能详解
1. 构建 KVM 环境 KVM 从诞生开始就需要硬件虚拟化的支持,KVM 必需的硬件虚拟化扩展分别是:Intel 的虚拟化技术(Intel VT)和 AMD 的 AMD-V 技术.首先处理器(CPU ...
- 可在广域网部署运行的QQ高仿版 -- GG叽叽V3.0,完善基础功能(源码)
(前段时间封闭式开发完了一个项目,最近才有时间继续更新GG的后续版本,对那些关注GG的朋友来说,真的是很抱歉.)GG的前面几个版本开发了一些比较高级的功能,像视频聊天.远程桌面.文件传送.远程磁盘等, ...
- 谷歌Chrome浏览器开发者工具的基础功能
上一篇我们学习了谷歌Chrome浏览器开发者工具的基础功能,下面介绍的是Chrome开发工具中最有用的面板Sources.Sources面板几乎是最常用到的Chrome功能面板,也是解决一般问题的主要 ...
- Netsharp快速入门(之16) Netsharp基础功能(权限管理)
第5章 Netsharp基础功能 5.1 权限配置 5.1.1 功能权限 1.配置权限功能点,打开平台工具-基础业务-操作管理 2.选择资源节点为销售订单,点添加常用操作,添加完成后 ...
- 李洪强iOS开发之-环信03_集成 SDK 基础功能
李洪强iOS开发之-环信03_集成 SDK 基础功能 集成 SDK 基础功能 在您阅读此文档时,我们假定您已经具备了基础的 iOS 应用开发经验,并能够理解相关基础概念. SDK 同步/异步方法区分 ...
- Keepalived详解(三):Keepalived基础功能应用实例【转】
Keepalived基础功能应用实例: 1.Keepalived基础HA功能演示: 在默认情况下,Keepalived可以实现对系统死机.网络异常及Keepalived本身进行监控,也就是说当系统出现 ...
- jmeter 基础功能详解
jmeter 基础功能详解 thread group:包含一组线程,每个线程独立地执行测试计划. sampler:采样器,有多种不同的sample实现,用来发起各种请求,如http请求,jdbc请求, ...
随机推荐
- [Swift]LeetCode270. 最近的二分搜索树的值 $ Closest Binary Search Tree Value
Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...
- [Swift]LeetCode501. 二叉搜索树中的众数 | Find Mode in Binary Search Tree
Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred ...
- 微信小程序中样式问题
1.去除button按钮的默认样式 这是button按钮自带的默认样式 button { position:relative; display:block; margin-left:auto; mar ...
- python的StringIO
有时候需要将 information 保存在本地,可以这样写: file = open("filename","w") file.close() file.cl ...
- Android_ FragmentTabHost切换Fragment时避免重复加载UI
使用FragmentTabHost时,Fragment之间切换时每次都会调用onCreateView方法,导致每次Fragment的布局都重绘,无法保持Fragment原有状态. 解决办法:在Frag ...
- gradle插件从3.2.0升级到3.2.1后报错Error: Cannot create directory 项目目录\thirdlib\build\intermediates\packaged_res\debug\drawable
报错信息如下: 解决方案: 删除thirdlib\build目录,然后重新编译. 但是紧接着又会报类似的错误,只不过build目录变成其他module的了. 所以,先clear build,然后再重 ...
- Why DDD and layered architecture
As a developer, you may think that your job is to write code. However, Software development is not a ...
- leetcode — recover-binary-search-tree
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util. ...
- 如何优雅地查看 JS 错误堆栈?
本文由云+社区发表 在前端,我们经常会通过 window.onerror 事件来捕获未处理的异常.假设捕获了一个异常,上报的堆栈是这个: TypeError: Cannot read property ...
- 如何设计一个 RPC 系统
本文由云+社区发表 RPC是一种方便的网络通信编程模型,由于和编程语言的高度结合,大大减少了处理网络数据的复杂度,让代码可读性也有可观的提高.但是RPC本身的构成却比较复杂,由于受到编程语言.网络模型 ...