Linuxのテキスト・ワード・カウント(ワード数)を達成するためにC言語を使用して、実行時の統計情報
由于WHUT的云计算课程实验要求,采用C lang实现word count功能。不得不说,用C语言处理字符串,真有一种想砸了电脑的冲动。。。
ここではソースコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
int* findn(int A[], int N);
int main() {
FILE* fp;
char fileName[256] = "/usr/local/data.dat";
// scanf("%s", &fileName);
fp = fopen(fileName, "r"); /* 以只读方式读取文件 */
clock_t start, stop;
start = clock();
int word_count = 0; // 记录单词总数
char store[60][15] = { '\0' };
char key[15] = { '\0' };
char temp[15] = { '\0' };
int weight[60] = {0};
int value = 0;
int key_length = 0;
while ((value = fgetc(fp)) != EOF) { /* 当文件未到末尾时,统计各对应字符的权值 (即频数) */
if (value != ' ') {
if (value != '.' && value != ',' && value != '!' && value != '?' && value != ':' && value != '#') {
key[key_length++] = value; // 获得单词key
}
}
if (value == ' ' || value == '#' || value == '\n') {
key[key_length] = '\0';
if (word_count == 0) { // 第一次
for (int m = 0; m <= key_length; m++) { // 将每个单词以行的形式存储在二维数组store中
store[0][m] = key[m];
}
weight[word_count]++;
word_count++;
} else {
int flag = 0;
for (int i = 0; i < word_count; i++) {
int k;
for (k = 0; store[i][k] != '\0'; k++) { // 将每个单词以行的形式存储在二维数组store中
temp[k] = store[i][k];
}
temp[k] = '\0';
int isOkay = -1;
if (abs(temp[0] - key[0]) == 32 && strlen(temp) == strlen(key)) { // 相差32 & 长度相同
char dest1[15] = { '\0' };
char dest2[15] = { '\0' };
int sub_length = strlen(temp) - 1;
strncpy(dest1, temp + 1, sub_length);
strncpy(dest2, key + 1, sub_length);
isOkay = strcmp(dest1, dest2);
if (isOkay == 0) { // 相同单词, 首字母大小写不同
weight[i]++;
flag = 1;
break;
}
}
else {
isOkay = strcmp(key, temp); // 0相同, 1不同
if (isOkay == 0) { // 相同单词
weight[i]++;
flag = 1;
break;
}
}
}
if (flag == 0) { // 全新单词
for (int j = 0; j < key_length; j++) {
store[word_count][j] = key[j];
}
weight[word_count]++;
word_count++;
}
}
key_length = 0;
}
}
//for (int i = 0; i < word_count; i++) { // 调试用
// for (int j = 0; store[i][j] != '\0'; j++) {
// printf("%c", store[i][j]);
// }
// printf("%4d\n", weight[i]);
//}
int* index = findn(weight, word_count);
for (int i = 0; i < 3; i++) {
int order = *(index + i);
for (int j = 0; store[order][j] != '\0'; j++) {
printf("%c", store[order][j]);
}
printf("%4d\n", weight[order]);
}
stop = clock();
double duration = (double)(stop - start) / CLOCKS_PER_SEC;
printf("word_count time: %fs\n", duration);
return 0;
}
int* findn(int A[], int N) { // 冒泡排序
int value[3] = { 0 };
int max = 0;
static int index[3] = { 0 }; // 此处必须加static,否则报错!
for (int j = 0; j < 3; j++) {
for (int i = 0; i < N; i++) {
if (A[i] > max) {
max = i;
value[j] = A[i];
}
}
index[j] = max;
A[max] = 0;
max = 0;
}
for (int j = 0; j < 3; j++) {
A[index[j]] = value[j];
}
return index;
}
いくつかの説明:
-
完全に考慮にすべて英語で句読点を取るが、あなたはあなたのプログラムに所有することができない単語のキーを取得する位置の変更を!
-
プログラム#終了識別子として。
-
実行するためのLinux GCCコンパイラの下のプログラム。(入力ファイルパスを含めることはできません中国語(血液を学んだ!!)、が存在することになる
段错误(核心转储)
)
以下のように:
-
findn関数のみ見つけるためにワード数を達成する最初の三つの単語を、全く実装はプレワードの添字nは配列を返していないがあります。また、関数は、宣言の配列findnを返し、それに追加される必要があることに注意静的。
-
GNU LinuxのGCCコンパイラの下で、ヘッダファイル<string.hの>と<TIME.H>実装とVisual Studio C LANGコンパイラの実装異なるウィンドウの下に。
このプログラムの唯一の違いを示し、それらをここにリストしないでください。- Visual Studioの、C LANGコンパイラでは、strcpyの()文字列、およびLinuxでは、この機能の代わりにインターセプトに使用することができますはstrncpy()の実装。
- C LANGのVisual Studioのコンパイラでは、CLK_TCK 1クロックサイクル、およびLinuxでは、この機能は、代わりにCLOCKS_PER_SEC達成します。