我很困惑 scanf 如何與 getchar 一起作業。我假設 scanf 可以獲取用戶輸入,然后當用戶按下回車鍵時,它會分別分配輸入。而 getchar 的作業原理是獲取每個字符并將其分配給分配給 getchar 的變數。看看這段代碼:
#include <stdio.h>
int main (){
int num, i;
char ch;
printf("Enter an expression: ");
scanf("%d", &i);
while ((ch = getchar()) != '\n'){
if (ch == ' '){
scanf("%d", &num);
i = num;
break;
}
}
printf("%d", i);
}
我不應該輸入3次嗎?第一個scanf,然后是getchar,然后是最后一個scanf,還是我在這里遺漏了一些關鍵?我是 C 新手,希望你不要介意我的這個(可能是愚蠢的)問題:)
uj5u.com熱心網友回復:
scanf 當用戶按下回車鍵時,不參與傳輸資料。
C 程式有資料流。(即使它們是用FILE *型別處理的,它們也是流,而不是檔案。)scanf從標準輸入流中讀取。通常,標準輸入流連接到終端設備(過去是物理終端設備,現在更可能是軟體終端視窗)。終端設備具有有關何時將用戶鍵入的資料發送到流的協議。同樣最常見的是,當用戶按下 Enter 鍵時,他們輸入的資料會被發送到流中。此外,在 Unix 系統上,按下 control-D 會將輸入的資料發送到流。
為了完成它的作業,scanf向流請求一個字符。然后它分析字符如何匹配它正在處理的轉換。例如,當scanf正在作業的一個%d轉換,它預計可能存在在啟動(它跳過)一些空白字符,那么也許一個“ ”或“ - ”,那么一些數字。任何其他字符都會停止轉換。因此,當scanf開始%d轉換時,它會得到一個字符。如果沒有可用的字符,也許是因為用戶輸入了一些東西但還沒有按下 Enter,那么scanf就坐在那里等待字符到達。當用戶按下回車鍵時,scanf獲取第一個字符。
請注意,scanf沒有參與等待按下 Enter 鍵。那是終端的功能。此時,scanf只有第一個字符,不知道是否按下了回車鍵。
后scanf讀取數字,它讀取下一個字符。當該字符與%d模式不匹配時,它會將字符放回流中。因此,如果用戶鍵入“123 456”,則scanf處理“123”,得到“ ”,拒絕“ ”,并將“ ”推回到流中。
然后getchar得到“ ”并回傳它。
然后后者scanf讀取“456”。它還看到終端為輸入鍵放入流中的換行符,它拒絕它并將其推回到流中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335265.html
