c语言int类型的变量输入一个字符出错

 

今天遇到一个C语言的小问题,就是写一个简单的计算器,定义一个%f%c%f的三个变量,作2+3,2-3这种可以不断输入并输入“OFF”跳出循环的计算器功能,便会出现错误;

错误的示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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时退出函数;

 

修改好的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#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来判断是否跳出循环就可以啦!(问题解决了!开开心心睡觉~)

posted @   侠客小飞  阅读(1319)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示