關於getchar的一些思考

2022-08-30 15:51:21 字數 2065 閱讀 7571

這個問題是有一段**引起的:

(49是『1』的ascii碼)

**1的結果是很好理解的,但對於**二的結果很是納悶,為什麼會這樣呢?

我們都知道ungetc的作用是將字元t送回緩衝區,而getchar是從輸入的緩衝區中獲取乙個字元;

getchar的特點:

getchar有乙個int型的返回值.當程式呼叫getchar時.程式就等著使用者按鍵.使用者輸入的字元被存放在鍵盤緩衝區中.直到使用者按回車為止(回車字元也放在緩衝區中).當使用者鍵入回車之後,getchar才開始從stdin流中每次讀入乙個字元.getchar函式的返回值是使用者輸入的第乙個字元的ascii碼,如出錯返回-1,且將使用者輸入的字元回顯到螢幕.如使用者在按回車之前輸入了不止乙個字元,其他字元會保留在鍵盤快取區中,等待後續getchar呼叫讀取.也就是說,後續的getchar呼叫不會等待使用者按鍵,而直接讀取緩衝區中的字元,直到緩衝區中的字元讀完為後,才等待使用者按鍵.

乙個例子:

#includeusing namespace std;

int main()

{ char a=getchar();

char b=getchar();

cout執行結果:

我們一次輸入了「123」,都放到了緩衝區中,但是a值獲取了第乙個字元『1』,然後對於b我們不用輸入,而是自動從緩衝區獲取剩下的字元的第乙個,即『2',如果我們再使用一次getchar呢?沒錯,獲取的正是』3』;

我們回到原來的話題:

對於**1,t 一開始獲取了第乙個字元『1』,然後由ungetc將字元『1』又送回了緩衝區,然後又使用了cin,因為t是char型別的,所以cin只從緩衝區取出了乙個字元『1』,然後賦給了t.

對於**2,t 一開始獲取了第乙個字元『1』,因為是int型別,所以輸出了49,然後由ungetc將字元『1』又送回了緩衝區,然後又使用了cin,因為t是int型別的,所以cin從緩衝區取出了連續的數字,cin用於輸入整數的時候,是通過空格和回車進行分割的,所以這裡就取出了123並將其賦給了t.

為了驗證我們的猜想,我們還是先使用getchar,使用者輸入一行資料,然後再使用ungetc將首字元送回,然後在使用cin從緩衝區獲取資料並賦值給string型別變數,我們知道string型別變數可以獲取連續的字元,並且使用cin獲取時是通過空格或者回車進行分割的,所以應該跟**2的結果類似:

此處cin從『a'開始獲取資料直到遇到空格,然後將資料賦給了str

還需要說明的是**2的程式輸入,只適用於整數,當輸入的是整數字元(』0『~』9『)的時候,cin將緩衝區的資料按照整數的格式賦給了int型變數(注意不是型別轉換,我能想到的就是cin的時候自動呼叫了atoi函式);

當輸入的是其他字元的時候,cin就不能把緩衝區中的資料賦給int型變數了。

一些關於getchar讀取字元的思考

一 getchar是以行為單位進行讀取的。當我們用getchar來進行字元的讀取,當第乙個字元為有效字元的時候,getchar 也只在遇見 n 換行符和eof檔案結束符的時候,才會停止字元的輸出。對此唯一的解釋就是,k r在編寫c的時候,當時並沒有所謂終端輸入的概念,所有的輸入實際上都是按照檔案進行...

關於SpringIOC的一些思考

ioc是 依賴倒置原則 的乙個特例,說其是特例,就是說其具有 依賴倒置原則 的性質。依賴倒置原則強調的兩點是 上層模組和下次模組都依賴於抽象,二者之間通過這種抽象的東西聯絡在一起 具體可以依賴於抽象,而抽象不能依賴於具體。我認為spring提倡的 基於介面程式設計 就是為了遵循 依賴倒置原則 其中所...

關於sizeof 的一些思考

今天面試被問到sizeof,回來整理一下。1 定義 sizeof是c c 中的乙個操作符 operator 作用就是返回乙個物件或者型別所佔的記憶體位元組數。msdn上的解釋為 the sizeof keyword gives the amount of storage,in bytes,assoc...