zoukankan      html  css  js  c++  java
  • c语言int类型的变量输入一个字符出错

    今天遇到一个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
    ",x,z,y,x+y); }
    		else if(z=='-') {printf("%.2f%c%.2f=%.2f
    ",x,z,y,x-y); }
    		else if(z=='*') {printf("%.2f%c%.2f=%.2f
    ",x,z,y,x*y); }
    		else if(z=='/') {printf("%.2f%c%.2f=%.2f
    ",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
    ",x,z,y,x+y); }
    		else if(z=='-') {printf("%.2f%c%.2f=%.2f
    ",x,z,y,x-y); }
    		else if(z=='*') {printf("%.2f%c%.2f=%.2f
    ",x,z,y,x*y); }
    		else if(z=='/') {printf("%.2f%c%.2f=%.2f
    ",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
    ",x,z,y,x+y); }
    //		else if(z=='-') {printf("%.2f%c%.2f=%.2f
    ",x,z,y,x-y); }
    //		else if(z=='*') {printf("%.2f%c%.2f=%.2f
    ",x,z,y,x*y); }
    //		else if(z=='/') {printf("%.2f%c%.2f=%.2f
    ",x,z,y,x/y); }	
    //	}
    }  

     

    当scanf函数接收到字符串时,我们定义一个变量d来判断是否跳出循环就可以啦!(问题解决了!开开心心睡觉~)

  • 相关阅读:
    java 编程思想——基础篇
    JDK编译器针对final变量的优化
    Java源码分析:深入探讨Iterator模式——迭代器模式
    JDK源码分析:java.lang.String
    JDK源码分析——Java.util.Vector的浅析
    JDK1.5下的String优化
    关于GDAL打开hfa大文件的问题
    使用SQLite3支持中文路径
    如何使用GDAL进行AOI裁剪
    常用直线生成算法
  • 原文地址:https://www.cnblogs.com/ma1998/p/12081862.html
Copyright © 2011-2022 走看看