同時使用scanf()函數和getchar()函數的陷阱


函數名: scanf 
功 能: 執行格式化輸入 
用 法: int scanf(char *format[,argument,...]);
scanf()函數是通用終端格式化輸入函數,它從標准輸入設備(鍵盤) 讀取輸入的信息。
函數名:getchar
功能:從計算機終端(一般是鍵盤)輸入一個字符。
 
  同時使用者兩個函數時,會有陷阱,代碼如下:
  1. #include <stdio.h>  
  2.   
  3. int main(void)  
  4. {  
  5.     char buff[20],ch;  
  6.     int num,i=0;  
  7.     printf("請輸入一個數字:\n");  
  8.     scanf("%d",&num);  
  9.     printf("請輸入一個字符串:\n");  
  10.   
  11.     while((ch=getchar())!='\n')  
  12.     {  
  13.         buff[i] = ch;  
  14.         i++;  
  15.     }  
  16.     buff[i] = '\0';  

  運行如上代碼:

  發現並沒有給我們輸入字符串的機會,直接跳過了11行的while,這就是同時使用這兩個函數的陷阱,因為前面的scanf()在讀取輸入時會在緩沖區中留下一個字符'\n',所以如果不在此加一個
getchar()把這個回車符取走的話,getchar()就不會等待從鍵盤鍵入字符,而是會直接取走這個“無用的”回車符,從而導致讀取有誤,要解決這個問題,就要防止在使用getchar()之前還有'\n';處理方法是使用while(getchar()!='\n'); 清除之前的回車;代碼如下:

  1. #include <stdio.h>  
  2.   
  3. int main(void)  
  4. {  
  5.     char buff[20],ch;  
  6.     int num,i=0;  
  7.     printf("請輸入一個數字:\n");  
  8.     scanf("%d",&num);  
  9.     printf("請輸入一個字符串:\n");  
  10.     while(getchar()!='\n');    
  11.     while((ch=getchar())!='\n')  
  12.     {  
  13.         buff[i] = ch;  
  14.         i++;  
  15.     }  
  16.     buff[i] = '\0';  
  17. }  

  

問題完美解決。其實用 if((ch=getchar())=='\n');  也是可以的,只要從緩沖區讀出有'\n',就什么也不做,不要忘了有分號;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM