本程式能正確統計某程式設計語言原始檔的字元數,單詞數和行數,並能實現部分擴充功能,如返回程式的程式碼行/空行/註釋行/。程式攻分為4個主要函式,分別統計行數程式,統計字元數和單詞數函式,返回程式碼行和空行函式,返回註釋行函式。但程式不完善,我沒有寫出能遞迴處理目錄下符合條件的檔案函式。高階功能我也沒有實現。能力有限,只能期待日後改進。
#include<stdio.h> #include<stdlib.h> #include<string.h> void hangshu() { int num=0; FILE*fp; char str[500]; if((fp=fopen("test.txt","rt"))==NULL) { printf("cannot open file\n"); return; } while (fgets(str,500,fp)) { num++; } fclose(fp); printf("該檔案共有%d行\n",num); } void count() { char str[500]; int strLen; FILE*fp; int i; int j; int blank=0; int ch=0; int word=0; if((fp=fopen("test.txt","rt"))==NULL) { printf("cannot open file\n"); return; } while(fgets(str, 500, fp)) { strLen = strlen(str); for(i=0;i<strLen;i++) { j=str[i]; if(j==' '||j=='\t') { !blank&&word++; blank=1; } else if(j!='\n'&&j!='\r') { ch++; blank=0; } } !blank&&word++; blank=1; } printf("共有%d個單詞,%d個字元",word,ch); } void advanced() { int strLen; FILE*fp; char str[500]; if((fp=fopen("test.txt","rt"))==NULL) { printf("cannot open file\n"); return; } while (fgets(str,500,fp)) { strLen = strlen(str); if(strLen>3) { printf("%s是程式碼行.\n",str); } if(strLen<=3) { printf("%s是空行.\n",str); } } } void zhushi() { FILE*fp; int i =0; char str[500]; if((fp=fopen("test.txt","rt"))==NULL) { printf("cannot open file\n"); return; } fp=fopen("test.txt","r"); while(fgets(str,500,fp)) { str[i]=fgetc(fp); i++; } if (str[i]='\\') printf("%s是註釋行\n",str); fclose(fp); } void Menu() { printf("--------------------\n"); printf("----程式主選單------\n"); printf("--------------------\n"); printf("----1顯示行數---\n"); printf("----2顯示單詞數和字元數----\n"); printf("----3返回程式碼行和空行-------\n"); printf("----4返回註釋行-------\n"); printf("----5退出-----------\n"); printf("---Enter鍵返回選單---\n"); printf("--------------------\n"); printf("---請選擇:(1-5)-:---\n"); } void main() { char menuNum; while(1) { Menu(); scanf("%d",&menuNum); switch(menuNum) { case 1: hangshu(); break; case 2: count(); break; case 3: advanced(); break; case 4: zhushi(); break; case 5: exit(0); default: printf("\n輸入錯誤!\n"); printf("按任意鍵返回....\n"); getchar(); } } }