WordCount C语言实现求文本的字符数,单词数,行数

1.码云地址:

https://gitee.com/miaomiaobobo/WordCount

2.psp表格

PSP2.1表格


PSP2.1


PSP阶段


预估耗时

(分钟)


实际耗时

(分钟)


Planning


计划


25


20


· Estimate


· 估计这个任务需要多少时间


10


5


Development


开发


200 


350


· Analysis


· 需求分析 (包括学习新技术)


25


20


· Design Spec


· 生成设计文档


30  


20


· Design Review


· 设计复审 (和同事审核设计文档)


20


40


· Coding Standard


· 代码规范 (为目前的开发制定合适的规范)


20


15


· Design


· 具体设计


20


40


· Coding


· 具体编码


200    


300


· Code Review


· 代码复审


20


40


· Test


· 测试(自我测试,修改代码,提交修改)


30


60


Reporting


报告


20


20


· Test Report


· 测试报告


15  


10


· Size Measurement


· 计算工作量


10


10


· Postmortem & Process Improvement Plan


· 事后总结, 并提出过程改进计划


20


30


合计


665

950

3.需求功能分析

WordCount的需求:能够通过cmd执行.exe程序,并且传入文本文件,然后对其中的字符数,单词书,行数进行计算,并将结果保存在.exe程序的同级别目录下。

解题思路:1.通过cmd的命令行向main函数中传入操作方式与相应的文件。

2.通过设置flag记录上一个字符是否为空格结合当前是否为空格来判断单词数;

3.判断是否有“\n”来 确定行数。

其中,C语言实现WordCount参考链接:https://www.cnblogs.com/xiaobao123/articles/9649687.html

字符指针数组的空间分配参考链接:https://www.cnblogs.com/mensanu/p/7979462.html

4.程序设计

程序总共包含4个函数(main,countw,countc,countl)其中,main为主函数,通过传入的操作数不同分别调用不同的函数,

主要的模块有:

1.单词数的统计,当遇到空格时,如果上一个字符不是空格,则可判断这是一个新单词

while(fgets(buffer, 1003, fp) != NULL){
bufferLen = strlen(buffer);

for(i=0; i<bufferLen; i++){
c = buffer[i];
if( c==‘ ‘ || c==‘\t‘){
!isLastBlank && wordNum++; //当上一个不是空格,而这一个是空格时单词数+1
isLastBlank = 1;//表明一个空格
}else if(c!=‘\n‘&&c!=‘\r‘){

isLastBlank = 0;
}
}
!isLastBlank && wordNum++;

2.主函数,将cmd的操作指令传入,并通过函数strcmp进行比较,调用不同的函数:

int main(int argc,char* argv[]){
char filname[30];
char operation;
int totalline;//总行数
int toalchar;//总字符数
int totalword;//总单词数
if(!strcmp(argv[1],"-w"))
countw(argv[2]);
else if(!strcmp(argv[1],"-c"))

countc(argv[2]);
else if(!strcmp(argv[1],"-l"))
countl(argv[2]);
return 0;
}

5.具体代码(具体代码也可参考码云链接中的.cpp文件)

#include <stdio.h>
#include <string.h>
#include<malloc.h>
int countw(char *filename);
int countc(char *filename);
int countl(char *filename);

int main(int argc,char* argv[]){
char filname[30];
char operation;
int totalline;//总行数
int toalchar;//总字符数
int totalword;//总单词数
if(!strcmp(argv[1],"-w"))
countw(argv[2]);
else if(!strcmp(argv[1],"-c"))

countc(argv[2]);
else if(!strcmp(argv[1],"-l"))
countl(argv[2]);
return 0;
}

int countw(char *filename){
FILE *fp=NULL;
FILE *fp2=NULL;
char buffer[1003];
int bufferLen;
int i;
char c;
int isLastBlank = 0;
int totalword=0;
int wordNum = 0;
if( (fp=fopen(filename, "rb")) == NULL ){
perror(filename);
return NULL;
}

while(fgets(buffer, 1003, fp) != NULL){
bufferLen = strlen(buffer);

for(i=0; i<bufferLen; i++){
c = buffer[i];
if( c==‘ ‘ || c==‘\t‘){
!isLastBlank && wordNum++; //当上一个不是空格,而这一个是空格时单词数+1
isLastBlank = 1;//表明一个空格
}else if(c!=‘\n‘&&c!=‘\r‘){

isLastBlank = 0;
}
}
!isLastBlank && wordNum++;
isLastBlank = 1;
totalword += wordNum;
wordNum = 0;
}
printf("totalword:%d ",totalword);
fp2=fopen("result.txt","a");
if(fp2){
fprintf(fp2,"单词总数:%d\n",totalword);
fclose(fp2);
}
return 0;
}

int countc(char *filename){

FILE *fp=NULL;
FILE *fp2=NULL;
char buffer[1003];
int bufferLen;
int i;
char c;
int isLastBlank = 0;
int totalchar=0;
int charNum = 0;
if( (fp=fopen(filename, "rb")) == NULL ){
perror(filename);
return NULL;
}
while(fgets(buffer, 1003, fp) != NULL){
bufferLen = strlen(buffer);
for(i=0; i<bufferLen; i++){
c = buffer[i];
if( c==‘ ‘ || c==‘\t‘){
isLastBlank = 1;//字符不统计空格
}else if(c!=‘\n‘&&c!=‘\r‘){
charNum++;
isLastBlank = 0;
}
}

isLastBlank = 1;

totalchar += charNum;

charNum = 0;

}
printf("totalchar:%d",totalchar);
fp2=fopen("result.txt","a");
if(fp2){
fprintf(fp2,"字符总数:%d\n",totalchar);
fclose(fp2);
}
return 0;
}

int countl(char *filename){
FILE *fp=NULL;
FILE *fp2=NULL;
char buffer[1003];
int bufferLen;
int i;
char c;
int totalline=-1;
if( (fp=fopen(filename, "rb")) == NULL ){
perror(filename);
return NULL;
}

while(fgets(buffer, 1003, fp) != NULL){
bufferLen = strlen(buffer);
for(i=0; i<bufferLen; i++){
c=buffer[i];
if(c==‘\n‘||c==‘\r‘){
totalline++;

}
}
}
printf("totalline:%d",totalline);
fp2=fopen("result.txt","a");
if(fp2){
fprintf(fp2,"总行数:%d\n",totalline);
fclose(fp2);
}
return 0;

}

6.本程序的测试

cmd测试命令行:

待测试的文件:

处理的结果:

7.个人项目总结

本次项目,学到的很多新知识。但是在项目开始的时候,我本来对文本的处理不是很熟悉,所以在这方面花费了很多时间,之后通过cmd运行可执行文件也耗费了我大量的时间。所以,这个项目虽然实现的功能比较简单,但总的花费我差不多一天的时间,但收获也是巨大的,也明白了自己的不足。项目本身存在着一些缺陷,包括对错误操作的提示不足,只能进行单一文件处理等,都需要改进。

8.参考资料

1.C语言实现WordCount参考链接:https://www.cnblogs.com/xiaobao123/articles/9649687.html

2. 字符指针数组的空间分配参考链接:https://www.cnblogs.com/mensanu/p/7979462.html

3.%s在c语言中对于空格的处理 : http://bbs.bccn.net/thread-352772-1-1.html

4.git的使用:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/

原文地址:https://www.cnblogs.com/miaobo/p/9696026.html

时间: 2024-10-09 13:06:17

WordCount C语言实现求文本的字符数,单词数,行数的相关文章

关于wc.exe程序处理文件字符,单词数,行数

Gitee项目地址:https://gitee.com/xiecangxing/wc.git 本项目我只实现了基本功能,也就是文件的字符总数,单词总数,以及行数的计算,以及输出至哪个文件 并且直接使用C#语言进行编写 整个项目我集中在一个主类和一个主方法当中 以及十个方法,分别完成相应的任务,较为符合单一原则分别为 1.CheckFileName(string fileName) 检查文件名是否正确 2.CheckCommand(string command) 检查命令符是否正确 3.charC

c - 统计字符串&quot;字母,空格,数字,其他字符&quot;的个数和行数.

1 #include <stdio.h> 2 #include <ctype.h> 3 4 using namespace std; 5 6 /* 7 题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. 8 */ 9 10 void 11 count() { 12 //统计个数. 13 int letters = 0; 14 int spaces = 0; 15 int digit = 0; 16 int others = 0; 17 char curChar

C语言习题【2】自定义乘法口诀表行数和列数

如:输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表. #include<stdio.h> #include<math.h> void board(int* a) { int m; m = *a; for (int i = 1; i <= m; i++) { for (int j = 1; j <= i; j++) { printf("%d * %d = %-2d ",j, i, i * j); } printf("\n&qu

编译器DIY之———统计英文文本中的单词数,字符数和行数

咳咳,这一章节应该是连载编译器的DIY的,可是在做DIY之前先用flex 来练练手,对于后面的理解有帮助作用. 在word 中我经常看到有一个单词统计的功能,那么是怎么来实现的了,当然第一个念头就是遍历整个文本依据换行和空格对字符串进行分析,那么这是可行的.可是能不能简单点了,其实对文本做单词分析,大家都知道怎么做,难得地方可能就是代码的实现了,那么现在如果使用正则表达式来实现的话,那么一切问题就Over 了. 环境:ubuntu(当然装了flex的windows和mac也可以) 原码: %{

Android 简单统计文本文件字符数、单词数、行数Demo

做的demo是统计文本文件的字符数.单词数.行数的,首先呢,我们必须要有一个文本文件.所以我们要么创建一个文本文件,并保存,然后再解析:要么就提前把文本文件先放到模拟器上,然后检索到文本名再进行解析.我感觉第二种方法不可行,因为要测试时,肯定要多次测试,每次还要找到文件再修改文件内容,过于麻烦.所以我用的第一种方法,文件内容更改后直接保存即可. 首先是 页面布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res

java:打印菱形图案(传参打印的自定义字符和行数)

打印菱形图案: 代码实现: public class Hello { public static void main(String args[]) { LingXingPrint("#", 7); } public static void LingXingPrint(String i, int num) { /** * 打印菱形,传参:i 为打印的字符,num为行数 . * 思路:将菱形分为上三角和下三角,上三角:每一行空格打印数为总行数-行号:每一行字符打印个数为2*行号-1;下三角

Swift语言指南(十)--字符串与字符

原文:Swift语言指南(十)--字符串与字符 字符串是一段字符的有序集合,如"hellow,world"或"信天翁".Swift 中的字符串由 String 类型表示,对应着 Character 类型值的集合. Swift 中的 String 类型为你的编程提供了一个高速的,兼容 Unicode规范 的文本处理方式.Swift 创建和处理字符串的语法轻量可读,与 C 语言的字符串语法颇为相似.字符串的拼接非常简单,只需将两个字符串用 + 运算符相加.字符串的值是否

C语言最优化求素数

初学C语言,看到求素数的代码,不是太满意,自己设计了一个计算流程图.在贴吧里也问了一下,和"埃拉托色尼(Eratosthenes)筛法”有些撞车,当然在下不敢与数学巨匠们争长短,不过还是想自己试一下. 百度了一下有人已经用这类方法做了代码,不过和我的想法有出入. 思路: 1要避免冗余的求余计算的计算次数,这样在数字足够大的时候更能体现更高的计算效率, 1)分母排除偶数,可以减少一半的计算量.具体做法是改+1递增为从第二个素数3开始+2递增; 2)筛选求余计算的分子,而根据素数的定义,只要不被小于

序列点在C语言表达式求值中的作用

摘要: 本文开创性地分析了序列点在C语言表达式求值中的作用:序列点左边的操作数要先于其右边的操作数求值.讨论了逗号操作符,.逻辑与操作符&&.逻辑或操作符||和条件操作符?:的问号处需要序列点的原因.举例分析了序列点在表达式求值中的作用. 关键字:序列点 表达式求值 C语言 C语言作为一种主流程序设计语言,许多编程语言如Java.C++.C#都借鉴了它的语法.C语言也是一种很适当的程序设计入门的教学语言,国内大专院校的许多专业都开设了这门课程并且大多将其作为第一门程序设计语言课程,同时C语