1. 程式人生 > >讀取一段文本並輸出文本中每個不同單詞在文本中出現的次數

讀取一段文本並輸出文本中每個不同單詞在文本中出現的次數

ring malloc 重復 div amp 排序效率 ret fopen fop

題目:編寫一個程序,對一個文本文件進行分析,將不同單詞的個數按大小排序,並輸出該文件中每個不同單詞在文本中出現的次數

例如:To be or not to be, that is the question.Whether in the mind to stuffer

應輸出:to 3次,be 2次, or 1次

思路:

當前測試環境:開發工具xcode Version 10.1 (10B61),操作系統Macos 10.14.3

註意:由於stricmp不能使用,已被廢棄,所以使用strcasecmp功能是一樣的

代碼中內存申請沒有釋放,排序效率低

  1 #include <stdio.h>
  2
#include <strings.h> 3 #include <stdlib.h> 4 #include <xlocale.h> 5 6 struct myString 7 { 8 int count;//單詞出現重復次數 9 char *_str; 10 }; 11 struct words 12 { 13 int num; //當前存儲單詞個數 14 struct myString str[1024]; 15 }; 16 void readWords(struct
words *pw) 17 { 18 FILE *fp = fopen("book.txt","r"); 19 if(fp == NULL) 20 { 21 printf("文件打開出錯...\n"); 22 exit(0); 23 } 24 pw->num=0; 25 char ch = getc(fp); 26 char tmp[30] = {0}; 27 int i = 0; 28 int pre = 0; // 前一個字符是字母 29 int
current = 0;//當前字符是字母 30 while(ch != EOF) 31 { 32 if((ch >= a && ch <= z) || (ch >= A && ch <= Z) ) 33 { 34 current = 0; 35 //如果前一個不是字母,當前是字母 36 if(pre == -1 && current == 0) 37 { 38 i = 0; 39 tmp[i]=ch; 40 } 41 else if(pre == 0 && current == 0)//如果前一個是字母,且當前是字母 42 { 43 tmp[i] = ch; 44 } 45 ++i; 46 } 47 else 48 { 49 current = -1; 50 //如果前一個是字母,當前不是字母 51 if(pre == 0 && current == -1) 52 { 53 tmp[i] = \0; 54 //開始加入字符並比較 55 int j; 56 for(j = 0; j < pw->num; ++j) 57 { 58 //如果已保存相同單詞,則在相同單詞位置+1 59 if(strcasecmp(pw->str[j]._str, tmp) == 0) 60 { 61 pw->str[j].count++; 62 break; 63 } 64 } 65 //如果沒有匹配的單詞,則在數組中加入單詞,並置1; 66 if(j >= pw->num) 67 { 68 int len = (int)strlen(tmp) + 1; 69 pw->str[pw->num]._str = (char*)malloc(len*sizeof(char)); 70 strcpy(pw->str[pw->num]._str, tmp); 71 pw->str[pw->num].count = 1; 72 pw->num++; 73 i = 0; 74 // printf("tmp...%s\n", tmp); 75 } 76 } 77 } 78 ch = getc(fp); 79 pre = current; 80 } 81 } 82 void mySwap(struct myString *str1, struct myString *str2) 83 { 84 char *tmp; 85 int t; 86 tmp = str1->_str; 87 str1->_str = str2->_str; 88 str2->_str = tmp; 89 90 t = str1->count; 91 str1->count = str2->count; 92 str2->count = t; 93 } 94 void sortWords(struct words *pw) 95 { 96 struct myString *str = pw->str; 97 int num = pw->num; 98 for(int i = 0; i < num; ++i) 99 { 100 for(int j = i+1; j < num; ++j) 101 { 102 if(str[i].count < str[j].count) 103 { 104 mySwap(&(str[i]), &(str[j])); 105 } 106 } 107 } 108 } 109 void printWords(struct words *pw) 110 { 111 struct myString *str = pw->str; 112 int num = pw->num; 113 printf("單詞:\t\t出現次數:\n"); 114 for(int i = 0; i < num; ++i) 115 { 116 printf("%s\t\t%d\n", str[i]._str,str[i].count); 117 } 118 } 119 int main() 120 { 121 struct words w; 122 memset(&w, 0, sizeof(w)); 123 w.num = 0; 124 readWords(&w); 125 sortWords(&w); 126 printWords(&w); 127 return 0; 128 }

讀取一段文本並輸出文本中每個不同單詞在文本中出現的次數