C說話中字符的輸出輸入和盤算字符個數的辦法詳解。本站提示廣大學習愛好者:(C說話中字符的輸出輸入和盤算字符個數的辦法詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話中字符的輸出輸入和盤算字符個數的辦法詳解正文
C說話字符輸出與輸入
尺度庫供給的輸出/輸入模子異常簡略。不管文本從何處輸出,輸入到何處,其輸出/輸入都是依照字符流的方法處置。文本流是由多行字符組成的字符序列,而每行字符則由 0 個或多個字符構成,行末是一個換行符。尺度庫擔任使每一個輸出/輸入流都可以或許遵照這一模子。應用尺度庫的 C 說話法式員不用關懷在法式以外這些行是若何表現的。
尺度庫供給了一次讀/寫一個字符的函數,個中最簡略的是 getchar 和 putchar 兩個函數。每次挪用時,getchar 函數從文本流中讀入下一個輸出字符,並將其作為成果值前往。也就是說,在履行語句
c = getchar()
以後,變量 c 中將包括輸出流中的下一個字符。這類字符平日是經由過程鍵盤輸出的。
每次挪用 putchar 函數時將打印一個字符。例如,語句
putchar()
將把整型變量 c 的內容以字符的情勢打印出來,平日是顯示在屏幕上。putchar 與 printf 這兩個函數可以瓜代挪用,輸入的順序與挪用的順序分歧。
借助於 getchar 與 putchar 函數,可以在不懂得其它輸出/輸入常識的情形下編寫出數目驚人的有效的代碼。最簡略的例子就是把輸出一次一個字符地復制到輸入,其根本思惟以下:
讀一個字符
while(該字符不是文件停止指導符)
輸入剛讀入的字符
讀下一個字符
將上述根本思惟轉換為 C 說話法式為:
#include <stdio.h> /* copy input to output; 1st version*/ main() { int c; c = getchar(); while (c != EOF) { putchar(c); c = getchar(); } }
個中,關系運算符!=表現“不等於”。
字符在鍵盤、屏幕或其它的任何處所不管以甚麼情勢表示,它在機械外部都是以位形式存儲的。char 類型專門用於存儲這類字符型數據,固然任何整型(int)也能夠用於存儲字符型數據。由於某些潛伏的主要緣由,我們在此應用 int 類型。
這裡須要處理若何辨別文件中有用數據與輸出停止符的成績。C 說話采用的處理辦法是:在沒有輸出時,getchar 函數將前往一個特別值,這個特別值與任何現實字符都分歧。這個值稱為 EOF(end of file,文件停止)。我們在聲明變量 c 的時刻,必需讓它年夜到足以寄存 getchar 函數前往的任何值。這裡之所以不把 c 聲明成 char 類型,是由於它必需足夠年夜,除能存儲任何能夠的字符外還要能存儲文件停止符 EOF。是以,我們將 c 聲明成 int 類型。
EOF 界說在頭文件<stdio.h>中,是個整型數,其詳細數值是甚麼其實不主要,只需它與任何 char 類型的值都不雷同便可。這裡應用符號常量,可以確保法式不須要依附於其對應的任何特定的數值。
關於經歷比擬豐碩的 C 說話法式員,可以把這個字符復制法式編寫得更精華精辟一些。在 C 說話中,相似於
c = getchar()
之類的賦值操作是一個表達式,而且具有一個值,即賦值後右邊變量保留的值。也就是說,賦值可以作為更年夜的表達式的一部門湧現。假如將為 c 賦值的操作放在 while 輪回語句的測試部門中,上述字符復制法式即可以改寫成以下情勢:
#include <stdio.h> /* copy input to output; 2nd version */ main() { int c; while ((c = getchar()) != EOF) putchar(c); }
在該法式中,while 輪回語句起首讀一個字符並將其賦值給 c,然後測試該字符能否為文件停止標記。假如該字符不是文件停止標記,則履行 while 語句體,並打印該字符。隨後反復履行 while 語句。當達到輸出的開頭地位時,while 輪回語句終止履行,從而全部 main 函數履行停止。
以上這段法式將輸出集中化,getchar 函數在法式中只湧現了一次,如許就延長了法式,全部法式看起來更緊湊。習氣這類作風後,讀者就會發明依照這類方法編寫的法式更容易浏覽。我們常常會看到這類作風。(不外,假如我們過量地應用這類類型的龐雜語句,編寫的法式能夠會很難懂得,應盡可能防止這類情形。)
對 while 語句的前提部門來講,賦值表達式雙方的圓括號不克不及省略。不等於運算符!=的優先級比賦值運算符=的優先級要高,如許,在不應用圓括號的情形下關系測試!=將在賦值=操作之前履行。是以語句
c = getchar() != EOF
等價於語句
c = (getchar() != EOF)
該語句履行後,c 的值將被置為 0 或 1(取決於挪用 getchar 函數時能否碰著文件停止標記),這其實不是我們所願望的成果。
盤算字符個數
以下法式用於對字符停止計數:
#include <stdio.h> /* 統計輸出的字符數 Version 1.0 */ main() { long nc; nc = 0; while(getchar() != EOF) ++nc; printf("%ld\n", nc); }
個中,語句 ++nc; 引入了一個新的運算符++,其功效是履行加 1 操作。可以用語句 nc = nc + 1 取代它,但語句++nc 更精華精辟一些,且平日效力也更高。與該運算符響應的是自減運算符--。++與--這兩個運算符既可以作為前綴運算符(如++nc),也能夠作為後綴運算符(如 nc++)。我們在前面將看到,這兩種情勢在表達式中具有分歧的值,但++nc 與 nc++都使 nc 的值增長 1。今朝,我們只應用前綴情勢。
該字符計數法式應用 long 類型的變量寄存計數值,而沒有應用 int 類型的變量。long整型數(長整型)至多要占用 32 位存儲單位。在某些機械上 int 與 long 類型的長度雷同,但在一些機械上,int 類型的值能夠只要 16 位存儲單位的長度(最年夜值為 32767),如許,相當小的輸出都能夠使 int 類型的計數變量溢出。轉換解釋%ld 告知 printf 函數其對應的參數是 long 整型。
應用 double(雙精度浮點數)類型可以處置更年夜的數字。我們在這裡不應用 while 輪回語句,而用 for 輪回語句來展現編寫此輪回的另外一種辦法:
#include <stdio.h> /* count characters in input; 2nd version */ main() { double nc; for (nc = 0; getchar() != EOF; ++nc) ; printf("%.0f\n", nc); }
關於 float 與 double 類型。printf 函數都應用%f 停止解釋。%.0f 強迫不打印小數點和小數部門,是以小數部門的位數為 0。
在該法式段中,for 輪回語句的輪回體是空的,這是由於一切任務都在測試(前提)部門與增長步長部門完成了。但 C 說話的語律例則請求 for 輪回語句必需有一個輪回體,是以用零丁的分號取代。零丁的分號稱為空語句,它正好能知足 for 語句的這一請求。把它零丁放在一行是為了加倍能干。
在停止評論辯論字符計數法式之前,我們斟酌以下情形:假如輸出中不包括字符,那末,在第一次挪用 getchar 函數的叫候,while 語句或 for 語句中的前提測試從一開端就為假,法式的履行成果將為 0,這也是准確的成果。這一點很主要。whi1e 語句與 for 語句的長處之一就是在履行輪回體之前就對前提停止測試,假如前提不知足,則不履行輪回體,這便可能湧現輪回體一次都不履行的情形。在湧現 0 長度的輸出時,法式的處置應當靈巧一些,在湧現界限前提時,while 語句與 for 語句有助於確保法式履行公道的操作。
銜接兩個字符串的法式:
#include <stdio.h> #include <string.h> void main() { int i; char str1[30]="welcome to "; char str2[]= "www.nowamagic.net"; printf("%s\n",strcat(str1,str2)); scanf("%d", &i); }
在MFC下完成盤算字符串的法式:
void CNowaMagic_MFCDlg::OnBnClickedOk() { // TODO: 在此添加控件告訴處置法式代碼 //CDialogEx::OnOK(); //取得EDIT CEdit* pBoxOne; pBoxOne = (CEdit*) GetDlgItem(IDC_EDIT1); CString str; CString sStrLen; char tmp[10] = ""; pBoxOne-> GetWindowText(str); int nStrLen = str.GetLength(); sStrLen = itoa(nStrLen,tmp,10); CString str2 = _T("字符數為:"); MessageBox(str2 + sStrLen,_T("法式運轉成果"),MB_OK); str.ReleaseBuffer(); }
法式運轉成果以下:
為了更好地停止法式理論,推舉應用在MFC上也把法式理論一遍,有UI出來樂趣會更年夜。
一些細節以下:
界說 char tmp[10] = ""; 時假如不指定命組長度會形成內存越界。
用 str.GetLength(); 辦法獲得 CString 的長度。
itoa(int,str,10) 可以將整數轉換成字符串。int 就是要轉的整數,str是寄存轉後的字符串,10是形式(還有其他形式)。
銜接兩個 CString 可以直接用 + 操作符。