今天遇到一個C語言的小問題,就是寫一個簡單的計算器,定義一個%f%c%f的三個變量,作2+3,2-3這種可以不斷輸入並輸入“OFF”跳出循環的計算器功能,便會出現錯誤;
錯誤的示例代碼如下:
#include<stdio.h> int main() { float x,y; char z; while(1) { scanf("%f%c%f",&x,&z,&y); if(z=='+') {printf("%.2f%c%.2f=%.2f\n",x,z,y,x+y); } else if(z=='-') {printf("%.2f%c%.2f=%.2f\n",x,z,y,x-y); } else if(z=='*') {printf("%.2f%c%.2f=%.2f\n",x,z,y,x*y); } else if(z=='/') {printf("%.2f%c%.2f=%.2f\n",x,z,y,x/y); } else break; } }
它會不斷執行上一步的結果,陷入死循環。。。。
經過查找資料發現錯誤是因為C語言中,由於你輸入一個數字,系統會按照這個格式從緩沖區中讀取掉這個數據但是如果你輸入的字符,系統就會讀取失敗,這個字符還是留在緩沖區中,然后系統接着讀,還是讀取失敗,這個字符永遠留在緩沖區中,系統就永遠的讀不完 用int,float 定義變量,采用scanf("%d")函數進行數據輸入時,如果按下了非數字鍵,則scanf()函數會返回錯誤,即d==0;
利用這個特性,我們稍微修改一下程序,我們可以實現循環輸入計算並且輸入字符OFF時退出函數;
修改好的代碼如下:
#include<stdio.h> int main() { int a=1,i=0,o=0; float x,y; char z; int d; while(1) { d=scanf("%f%c%f",&x,&z,&y); if(d==0){printf("退出!");break;}; if(z=='+') {printf("%.2f%c%.2f=%.2f\n",x,z,y,x+y); } else if(z=='-') {printf("%.2f%c%.2f=%.2f\n",x,z,y,x-y); } else if(z=='*') {printf("%.2f%c%.2f=%.2f\n",x,z,y,x*y); } else if(z=='/') {printf("%.2f%c%.2f=%.2f\n",x,z,y,x/y); } } //少寫一行代碼的方法 // while(d=scanf("%f%c%f",&x,&z,&y)) // { // if(d==0){printf("退出!");break;}; // if(z=='+') {printf("%.2f%c%.2f=%.2f\n",x,z,y,x+y); } // else if(z=='-') {printf("%.2f%c%.2f=%.2f\n",x,z,y,x-y); } // else if(z=='*') {printf("%.2f%c%.2f=%.2f\n",x,z,y,x*y); } // else if(z=='/') {printf("%.2f%c%.2f=%.2f\n",x,z,y,x/y); } // } }
當scanf函數接收到字符串時,我們定義一個變量d來判斷是否跳出循環就可以啦!(問題解決了!開開心心睡覺~)