1. 程式人生 > 其它 >編寫一函式,由實參傳來一個字串,統計此字串中字母、數字、空格和其它字元的個數,在主函式中輸入字串以及輸出上述的結果。

編寫一函式,由實參傳來一個字串,統計此字串中字母、數字、空格和其它字元的個數,在主函式中輸入字串以及輸出上述的結果。

技術標籤:函式c++

知識點:函式的呼叫和字元陣列的運用。

字元陣列是指用來存放字元資料的陣列。其定義的一般形式為: char 陣列名[資料長度] 。字元陣列用於存放字元或字串,字元陣列中的一個元素存放一個字元,它在記憶體中佔用一個位元組。

在做這題時,需要思考一下。從實參傳入字串到形參進行統計,形參統計字元的數量時會用到迴圈,但我們輸入的字串是隨機的,並沒有準確的量。

另外迴圈中給定的條件,必須要達到條件滿足時才可停止。舉個例子,假設迴圈結束條件是 i<=10,我們在輸入字元時需得輸入十個或十個以上才會停止輸入進行統計,因此這樣會非常侷限。

提到這個問題後,我們今天就講述一下字串的串結束標誌

定義

字串和字串結束標誌
在C語言中,是將字串作為字元陣列來處理的。為了測定字串的實際長度,C語言規定了一個“字串結束標誌”,以字元’\0’作為結束標誌

簡而言之,在每個字串結束後計算機會自動新增結束標誌,來判定此字串已經結束。

細心的同學可能已經發現解決迴圈統計的問題了,將串結束標誌作為迴圈結束條件,當字元陣列中輸出的元素等於串結束標誌,那麼此迴圈便會結束。是不是就達到了我們隨機輸入效果了。

for (int i = 0; a[i]!='\0'; i++)

陳述: 由主函式輸入一串字元,通過呼叫函式統計其中字母、數字等的個數。

分析:

  1. 建立統計字串個數函式。定義要統計的變數名,分別賦初值為 0 。
  2. 利用迴圈輸出由主函式輸入的字串,並進行判斷輸出元素是否字母,如果是,字母變數++(自增,加一)。
  3. 對需要統計的型別依次進行判斷,最後輸出。
void statistical(char a[])
{
	int letter = 0;
	int number = 0;
	int space = 0;
	int other = 0;
	for (int i = 0; a[i]!='\0'; i++)
	{
		if ((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z'))
			letter++
; else if (a[i] >= '0' && a[i] <= '9') number++; else if (a[i] == ' ') space++; else other++; } cout << "字母的個數有:" << letter << endl;; cout << "數字的個數有:" << number << endl; cout << "空格的個數有:" << space<<endl; cout << "其他個數有:" << other << endl; }

進行到這裡,我們簡單講一下關於從主函式輸入字串的問題。

同學們熟悉c和c++中的輸入是 scanf 和 cin ,但這兩個函式輸入字串時存在一個問題,就是如果輸入了空格會認為字串結束,空格後的字元將作為下一個輸入項處理,。

針對此問題,我們可以引入 cin.getline 和 gets 函式輸入 。

cin.getline

此函式會一次讀取多個字元(包括空白字元)。它以指定的地址為存放第一個讀取的字元的位置,依次向後存放讀取的字元,直到讀滿N-1個,或者遇到指定的結束符為止。若不指定結束符,則預設結束符為換行符,此函式並不保留結束符,它通過結束符確定結束,但不儲存結束符,它用空字元來替換結束符。其語法為:
cin.getline( 字元陣列變數名,字元陣列元素的個數,結束符)。
為char a[10]輸入元素,cingetline(a,10,’\n’)。

gets

gets從標準輸入裝置讀字串函式,其可以無限讀取,不會判斷上限,以回車結束讀取,所以程式設計師應該確保buffer的空間足夠大,以便在執行讀操作時不發生溢位。
語法:gets(字串變數名)
為char a[10]輸入元素,gets(a)。
gets()函式用來從標準輸入裝置(鍵盤)讀取字串直到換行符結束,但換行符會被丟棄,然後在末尾新增’\0’字元。

gets函式與cin.getline函式相似,同學們可以先記住用法,關於具體表現的作用可以去查閱資料。

程式碼演示

#include<iostream>
using namespace std;
#define N 50
void statistical(char a[])
{
	int letter = 0;
	int number = 0;
	int space = 0;
	int other = 0;
	for (int i = 0; a[i]!='\0'; i++)
	{
		if ((a[i] >= 'a' && a[i] <= 'z') || (a[i] >= 'A' && a[i] <= 'Z'))
			letter++;
		else if (a[i] >= '0' && a[i] <= '9')
			number++;
		else if (a[i] == ' ')
			space++;
		else
			other++;
	}
	cout << "字母的個數有:" << letter << endl;;
	cout << "數字的個數有:" << number << endl;
	cout << "空格的個數有:" << space<<endl;
	cout << "其他個數有:" << other << endl;

}
int main()
{
	char a[N];
	cout << "Please enter a string of characters: " << endl;
	//gets_s(a);//vs不支援gets,需要在後面加上_s
	cin.getline(a, N,'\n');
	statistical(a);
	return 0;
}