1. 程式人生 > >WordCount C語言實現求文本的字符數,單詞數,行數

WordCount C語言實現求文本的字符數,單詞數,行數

tee std port == .html 復制代碼 錯誤 str name

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/

WordCount C語言實現求文本的字符數,單詞數,行數