函數名: scanf
功 能: 執行格式化輸入
用 法: int scanf(char *format[,argument,...]);
功 能: 執行格式化輸入
用 法: int scanf(char *format[,argument,...]);
scanf()函數是通用終端格式化輸入函數,它從標准輸入設備(鍵盤) 讀取輸入的信息。
函數名:getchar
功能:從計算機終端(一般是鍵盤)輸入一個字符。
同時使用者兩個函數時,會有陷阱,代碼如下:
- #include <stdio.h>
- int main(void)
- {
- char buff[20],ch;
- int num,i=0;
- printf("請輸入一個數字:\n");
- scanf("%d",&num);
- printf("請輸入一個字符串:\n");
- while((ch=getchar())!='\n')
- {
- buff[i] = ch;
- i++;
- }
- buff[i] = '\0';
- }
運行如上代碼:
發現並沒有給我們輸入字符串的機會,直接跳過了11行的while,這就是同時使用這兩個函數的陷阱,因為前面的scanf()在讀取輸入時會在緩沖區中留下一個字符'\n',所以如果不在此加一個
getchar()把這個回車符取走的話,getchar()就不會等待從鍵盤鍵入字符,而是會直接取走這個“無用的”回車符,從而導致讀取有誤,要解決這個問題,就要防止在使用getchar()之前還有'\n';處理方法是使用while(getchar()!='\n'); 清除之前的回車;代碼如下:
- #include <stdio.h>
- int main(void)
- {
- char buff[20],ch;
- int num,i=0;
- printf("請輸入一個數字:\n");
- scanf("%d",&num);
- printf("請輸入一個字符串:\n");
- while(getchar()!='\n');
- while((ch=getchar())!='\n')
- {
- buff[i] = ch;
- i++;
- }
- buff[i] = '\0';
- }
問題完美解決。其實用 if((ch=getchar())=='\n'); 也是可以的,只要從緩沖區讀出有'\n',就什么也不做,不要忘了有分號;