程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話中字符的輸出輸入和盤算字符個數的辦法詳解

C說話中字符的輸出輸入和盤算字符個數的辦法詳解

編輯:關於C++

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 可以直接用 + 操作符。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved