天天看點

字元比對新方案——寬字元wchar_t

在c99标準裡,增加wchar_t,也就是寬字元,省事了好多有木有,一位寬字元就可以存一個漢字了!

摘自百科:

char是8位 字元類型,最多隻能包含256種字元,許多外文 字元集所含的字元數目超過256個,char型無法表示。 wchar_t 資料類型一般為16位或32位,但不同的C或C++庫有不同的規定,如GNU Libc規定wchar_t為32位 [1]  ,總之,wchar_t所能表示的 字元數遠超char型。 标準C++中的wprintf()函數以及iostream類庫中的 類和對象能提供wchar_t 寬字元類型的相關操作。

接下來我們用它寫個字元比對的程式,查找一段文字中各字的出現次數:

//Vs2005以上方可運作
#include <iostream>
#include <locale>
#include <cstdlib>

using namespace std;

locale loc("chs");


int main()
{
	wchar_t wStr[] = L"上面通過3個例子介紹了逐漸求精的程式設計方法通過這些例子可以看到,逐漸求精的方法的最大優點是擺脫了傳統的程式設計方法的束縛,按照先全局後局部、先整體後細節、先抽象後具體的過程組織人們的思維活動,使得編寫的程式結構清晰、容易閱讀、容易修改。同時,還可以結合逐漸求精的過程進行程式的正确性驗證,即采取邊設計、邊驗證的方法,以簡化程式正确性的驗證。";

	wchar_t wStr1[200] = L"";//存放字的數組,可以了解成字典
	int Textcount = 0, Dcount = 0;//整段文字的字數   不同字的數目(其實就是前兩個數組的長度)
	float count[200] = { 0 };//相應的每個字的個數
	bool exist = false;//判斷這個字字典是否存在
	for (int i = 0; i < 200; i++)
	{
		if (wStr[i] == L'\0')
		{
			Textcount = i;
			break;
		}
		for (int m = 0; m < 200; m++)
		{
			if (wStr[i] == wStr1[m])
			{
				count[m]++;
				exist = true;
				break;
			}
			if (wStr[m] == L'\0')
			{
				break;
			}
		}
		if (exist == false)
		{
			wStr1[Dcount] = wStr[i];
			count[Dcount]++;
			Dcount++;
		}
		exist = false;

	}
	wcout.imbue(loc);
	cout << "這段文字是:" << endl;
	wcout << wStr << endl;
	cout << "/" << endl;
	cout << "共有" << Textcount << "個字(包括漢字、數字、字母、标點)" << endl;
	cout << "/" << endl;
	cout << "共有" << Dcount << "個不同的字,字及出現次數如下:" << endl;
	cout << "/" << endl;

	for (int i = 0; i < 100; i++)
	{
		if (count[i] == 0)
		{
			break;
		}
		wcout << wStr1[i] << "字:";
		cout << (int)count[i] << "個" << "  出現頻率:" << count[i]*100 / Dcount <<"%"<< endl;

	}
	getchar();
	return 0;
}