C語言scanf函數處理機制及getchar機制

函數 scanf() 是從標準輸入流stdio (標準輸入設備,一般指向鍵盤)中讀內容的通用子程序,可以說明的格式讀入多個字符,並保存在對應地址的變量中。
其調用格式爲: scanf(“<格式化字符串>”,<地址表>);
scanf()函數返回成功賦值的數據項數,出錯時則返回EOF。
格式字符串包括三種字符“格式化符“,如”%d,%c,%s”等;”空白符”,如空格,製表符,新行符;”非空白符”,如”,”等。
空白符:空白字符會使scanf函數在讀操作中略去輸入中的一個或多個空白字符。
非空白符:一個非空白字符會使scanf()函數在讀入時剔除掉與這個非空白字符相同的字符。

如:scanf(“%d%d”,&a,&b);
  或scanf(“%d %d”,&a,&b); 輸入時: 1 2
  scanf(“%d,%d”,&a,&b); 輸入時:1,2

關鍵:在用格式化符%c時,空格,轉義符均爲有效字符;
 例:scanf(“%c%c%c”,&a,&b,&c);
 輸入:a□b□c
 則:a=’a’,b=’□’,c=’b’
實際遇到的問題:

int main()
  4 {
  5     char a,b;
  6     scanf("%c",&a);
  7     scanf("%c",&b);
  8     printf("%c %c",a,b);
  9     return 0;
 10 }

gdb調試:

6       scanf("%c",&a);
(gdb) n
a
7       scanf("%c",&b);
(gdb) n
8       printf("%c %c",a,b);
(gdb) p a
$1 = 97 'a'
(gdb) p b
$2 = 10 '\n'

當輸入完a的值後,回車也被b接受,在實際運行輸入完a就直接打印a結束。
優化:

int main()
  4 {
  5     char a,b;
  6     scanf("%c",&a);
  7     getchar();
  8     scanf("%c",&b);
  9     printf("%c  %c",a,b);
 10     return 0;
 11 }

在scanf前加上getchar();

6       scanf("%c",&a);
(gdb) n
a
7       getchar();
(gdb) n
8       scanf("%c",&b);
(gdb) 
b
9       printf("%c  %c",a,b);
(gdb) n
10      return 0;
(gdb) p a
$1 = 97 'a'
(gdb) p b
$2 = 98 'b'

百度百科getchar機制:
 當程序調用getchar時.程序就等着用戶按鍵。用戶輸入的字符被存放在鍵盤緩衝區中。直到用戶按回車爲止(回車字符也放在緩衝區中)。當用戶鍵入回車之後,getchar纔開始從stdio流中每次讀入一個字符。如用戶在按回車之前輸入了不止一個字符,其他字符會保留在鍵盤緩存區中,等待後續getchar調用讀取。也就是說,後續的getchar調用不會等待用戶按鍵,而直接讀取緩衝區中的字符,直到緩衝區中的字符讀完爲後,纔等待用戶按鍵。

fflush(stdin)函數:對於上面情況處理無效,還沒能搞懂,此處保留。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章