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来判断是否跳出循环就可以啦!(问题解决了!开开心心睡觉~)
代码成就万世基积沙镇海
梦想永在凌云意意气风发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?