Linuxのテキスト・ワード・カウント(ワード数)を達成するためにC言語を使用して、実行時の統計情報

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;

}


いくつかの説明

  1. 完全に考慮にすべて英語で句読点を取るが、あなたはあなたのプログラムに所有することができない単語のキーを取得する位置の変更を!

  2. プログラム終了識別子として。

  3. 実行するためのLinux GCCコンパイラの下のプログラム。(入力ファイルパスを含めることはできません中国語(血液を学んだ!!)、が存在することになる段错误(核心转储)
    以下のように:
    ここに画像を挿入説明

  4. findn関数のみ見つけるためにワード数を達成する最初の三つの単語を、全く実装はプレワードの添字nは配列を返していないがあります。また、関数は、宣言の配列findnを返し、それに追加される必要があることに注意静的

  5. GNU LinuxのGCCコンパイラの下で、ヘッダファイル<string.hの><TIME.H>実装とVisual Studio C LANGコンパイラの実装異なるウィンドウの下に。
    このプログラムの唯一の違いを示し、それらをここにリストしないでください。

    1. Visual Studioの、C LANGコンパイラでは、strcpyの()文字列、およびLinuxでは、この機能の代わりにインターセプトに使用することができますはstrncpy()の実装。
    2. C LANGのVisual Studioのコンパイラでは、CLK_TCK 1クロックサイクル、およびLinuxでは、この機能は、代わりにCLOCKS_PER_SEC達成します。

最後に、C LANG文字列が本当にゴミ扱い言っていました!ため息しなければならなかった、JavaのString素晴らしいです!

公開された69元の記事 ウォン称賛11 ビュー8440

おすすめ

転載: blog.csdn.net/qq_40994260/article/details/105091051