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\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来判断是否跳出循环就可以啦!(问题解决了!开开心心睡觉~)
c语言int类型的变量输入一个字符出错的更多相关文章
- 编写Java程序,方法练习题__构建英雄类,定义一个int类型的变量output,表示英雄的血量
返回本章节 返回作业目录 需求说明: 定义一个int类型的变量output,表示英雄的血量,当battle()方法执行一次,output变量值减少10.在控制台随机输入一个小于100的整数,将该整数值 ...
- 假设程序需要一个int类型的变量来保持你所有的音乐CD的数量
假设程序需要一个int类型的变量来保持你所有的音乐CD的数量.初始值为0为该变量编写一条声明语句 int numCDs = 0;
- 使用 JavaScript 中的变量、数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算符的不同位置得到不同的结果
查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的变量.数据类型和运算符,计算出两个 number 类型的变量与一个 string 类型的变量的和,根据 string 类型处于运算 ...
- elementUi中input输入字符光标在输入一个字符后,光标失去焦点
elementUi中input输入字符光标在输入一个字符后,光标就退出,无法输入需要再次聚焦然后输入一个字符又再次退出 首先,用elementUi正常用v-model绑定输入的值是不会造成光标退出的, ...
- python 输入一个字符,是小写转换为大写,大写转换为小写,其他字符原样输出
s = input('请输入一个字符:') if 'a' <= s <= 'z': print(chr(ord(s) - 32)) elif 'A' <= s <= 'Z': ...
- Java中如何输入一个字符
今天在QQ群上看见有人问如何在Java中输入一个字符的问题. 查了下有以下三种方法吧: char c = new java.util.Scanner(System.in).next().charAt( ...
- java将int类型的变量转化成String类型的
第一种方法:String的valueOf方法,int i=5;String s=String.valueOf(i);第二种方法,直接在int后面加一个空的字符串,因为在java里面,默认任务int类型 ...
- C语言的指针用法:输入一堆字符,把非字母的删去。
char *p,a[20]; int i; gets(a); //这个语句不同于getchar(),后者只能一次输入一个,而前者可以一次输完所有的字符!!! p=a; //这个语句 ...
- c/c++,输入一个字符 2014-11-20 07:00 30人阅读 评论(0) 收藏
getch().getche()和getchar()函数 (1) getch()和getche()函数 这两个函数都是从键盘上读入一个字符.其调用格式为: getch(); ...
随机推荐
- c# Invoke的新用法
在C# 3.0及以后的版本中有了Lamda表达式,像上面这种匿名委托有了更简洁的写法..NET Framework 3.5及以后版本更能用Action封装方法.例如以下写法可以看上去非常简洁: voi ...
- python的函数编程
python的函数可以当作一个变量传递,去掉函数后面的括号就是函数变量例如:math.abs,math.log
- Centos7防火墙关闭和启用iptables操作
https://yq.aliyun.com/ziliao/33590前序 还是docker惹得最近做的系统都是上的centos7的系统带来的一系列的新环境的适应 补记下:在使用oracle vmbox ...
- 微信小程序,内容组件中兼容的H5组件
受信任的HTML节点及属性 全局支持class和style属性,不支持id属性. 节点 属性 a abbr address article aside b bdi bdo ...
- ubuntu18.04 阿里镜像源
备份:cp /etc/apt/sources.list /etc/apt/sources.list.bak 清空source.list:echo > /etc/apt/sources.list ...
- todo---git 生成密钥 原理分析
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRJkDZ2z7syFC2QDCaORKF41ecwbL/kyFwkycOVE3MavTRBliAhoAhOaZQTr4j ...
- spring boot配置文件application.properties配置JPA以及数据源
1.application.properties配置jpa模板 spring.datasource.url=jdbc:mysql://localhost:3306/springboottest?use ...
- 二进制知识(java中的位操作)
文章目录 前言 机器数 真值 原码 反码 补码 计算机中保存的都是补码 位操作 强制转换,精度丢失 前言 讲二进制的东西,必须要说明是多少位机器,八位机上的 1000 1000 和 十六位机上的 10 ...
- 长乐培训Day9
T1 立方数 题目 [题目描述] 作为XX战队的狂热粉丝,MdZzZZ看到了自己心仪的队伍在半决赛落败,顿时心灰意冷.看着自己手中的从黄牛那里抢来的天价总决赛门票,MdZzZZ觉得去鸟巢已经没有意义了 ...
- python 之 并发编程(开启子进程的两种方式,进程对象的属性)
第九章并发编程 同一个程序执行多次是多个进程 import time import os print('爹是:',os.getppid()) #父进程PID,(pycharm) print('me ...