今天遇到一个 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 来判断是否跳出循环就可以啦!(问题解决了! 开开心心睡觉~)
来源: http://www.bubuko.com/infodetail-3345630.html