C語言中scanf與鍵盤緩衝區

2021-05-24 14:58:00 字數 1367 閱讀 9312

1.螢幕輸入與鍵盤緩衝區儲存

根據ascii表儲存ascii值。

若輸入97+回車鍵,則緩衝區儲存的是39h,37h,0ah.

2.整型格式輸入

scanf("%d",&a);

過程:scanf按照%d格式最多掃瞄buffer中前4個位元組。

如果在讀取buffer前四個位元組中沒有遇到回車符,那麼將4個位元組按照%d轉化為4個位元組的整型。

如果在讀取buffer前四個位元組中遇到回車符,那麼將回車符前面的幾個位元組按照%d轉化為4個位元組的整型。

4個位元組的整數按照最低位位元組,次低位,次高位,最高位依次存放在以&a開始的位址上。即&a放最低位位元組,&a+1放次低位...

最後將回車符之前的和回車符本身從緩衝區中刪除。

舉例:如果輸入258+回車鍵,而a的定義有如下的幾種可能:

char a;//位址&a的單個位元組中存放的是最低位位元組

char a[4];//位址&a的單個位元組中存放的是最低位位元組,&a+1放次低位...,即a[0]為02h,a[1]為01h,a[2]為00h,a[3]為00h。

char a[2];//位址&a的單個位元組中存放的是最低位位元組,&a+1放次低位...,即a[0]為02h,a[1]為01h。

對於以上的char a;和char a[2];來說,當4個位元組的整數給&a開始的位址賦值時,會發生位址越界,這是很危險的。

所以a的定義至少4個位元組才是安全的。

3.字元格式輸入

scanf("%c",&a);

過程:scanf按照%c格式最多掃瞄buffer中前1個位元組。

如果在讀取buffer前1個位元組中沒有遇到回車符,那麼將1個位元組直接賦給以&a開始的位址。如果在讀取buffer前1個位元組中遇到回車符,那麼將回車符0ah賦給以&a開始的位址。即無論遇到什麼字元,都直接賦給以&a開始的位址。

最後將第乙個位元組從緩衝區刪除。

舉例:char a;

char b;

scanf("%c",&a);

scanf("%c",&b);

printf("%d %d",a,b);

輸入9+回車符,輸出57 10。

4.按照字串格式輸入

scanf("%s",&a);

過程:scanf會按照%s的格式對buffer按位元組順序掃瞄,當掃瞄到0ah時,結束掃瞄(按照%s的要求,空格20h也是掃瞄結束點)。

將0ah之前的字串賦給從&a開始的位址。

最後從緩衝區中刪除字串和回車符。

5.輸入格式前加空格

scanf(" %c",&a);

過程:空格具有特殊作用。如果緩衝區第乙個字元是回車符或者空格符,則刪除。

然後從緩衝區中讀取乙個位元組賦給從&a開始的位址。

最後從緩衝區中刪除該位元組。

C語言scanf 與緩衝區

scanf函式返回值 正整數,表示正確輸入引數的個數。例如執行 scanf d d a,b 如果使用者輸入 3 4 可以正確輸入,返回2 正確輸入了兩個變數 如果使用者輸入 3,4 可以正確輸入a,無法輸入b,返回1 正確輸入了乙個變數 0,表示使用者的輸入不匹配,無法正確輸入任何值。如上例,使用者...

C語言中scanf函式與輸入緩衝區

樣例 於演算法競賽入門經典第一章實驗部分的內容,經過測試發現scanf函式對於整形資料在讀入時會過濾掉 空格符 換行符 和 水平製表符。按照提示,如果b的值非法,比如說輸入乙個字元 s 那麼會出現什麼結果呢?void scanf buffer void phase 1 輸入的兩個數均為合法的int型...

關於scanf 緩衝區

c語言中的輸入函式 包括scanf,getchar等 在接收鍵盤輸入時,把輸入放在了 輸入緩衝區 當scanf getchar 做輸入操作時,以回車符作為結束標誌,並把回車符 n 包含在輸入字串中儲存在緩衝區,再從輸入緩衝區中取走輸入字串賦值給變數,但卻沒有取走回車符 n 再當我們二次呼叫scanf...