如何从键盘输入数字字符|只有在输入完数据再按回车键后,该行数据才被送入内存上的键盘缓冲区里,形成输入流
来源:互联网 发布:睡了很久还是困 知乎 编辑:程序博客网 时间:2024/05/12 03:56
1、如何从键盘输入数字字符?用如getchar()函数时即可,即从键盘输入7,获得即是字符'7'。
2、只有在输入完数据再按回车键后,该行数据才被送入内存上的键盘缓冲区里,形成输入流。
而在输入完数据再按回车键后,该行数据才被送入内存上的键盘缓冲区里这一工作是由键盘驱动程序来完成的,即键盘驱动程序(编程设计该程序时)是以回车键为标志符将暂存在键盘这个输入设备的缓存器(属于键盘这个硬件设备的一部分)里的输入数据送入内存上的键盘缓冲区里,编程设计该程序时文件结束符是作为一个普通字符对待的,未将其作为啥标志符的作用,所以键盘驱动程序遇到文件结束符输入时不会像回车键输入那样发生将暂存在键盘这个输入设备的缓存器(属于键盘这个硬件设备的一部分)里的输入数据送入内存上的键盘缓冲区里的情况。而像
getchar()函数或是cin的输入符>>等输入函数(在软件层次上相对于键盘驱动程序,是其上层接口函数)开始执行时都是先判断内存上的键盘缓冲区里的数据是否为空,为空的话就处于等待状态,直到有数据来时才开始读取内存上的键盘缓冲区里的数据到相应的变量上。可以参看-控制台和端口 I/O等内容。
getchar()函数或是cin的输入符>>等输入函数(在软件层次上相对于键盘驱动程序,是其上层接口函数)则是在编程设计该函数时以文件结束符作为将其读取的输入流(缓存)的状态是否置为无效的标志之一。其他无效字符,视具体情况而定,如cin>>var,如果var是char类型的变量,则输入字符k,k不会视为无效字符而让输入流状态置为无效,如果var是int或是float等非字符数据类型的变量,则输入字符k,k会视为无效字符而让输入流状态置为无效。
附加:
从键盘输入4个9以内的数字字符
从键盘输入4个9以内的数字字符,将其转换为4位十进制数后显示出来。
/*分析:⑴将每个数字字符c变成对应的数字,即将以ASCII码表示的数字字符变成一位十进制数,方法为:c-'0',如c='8'时,c-'0'=8。转换中若遇非'0'~'9'字符则结束转换。
⑵将每次变换的一位十进制数,从高位开始,按位加权,变成多位的十进制数,放在变量data中。如输入1,2,3,4,则结果应是按%d格式显示的1234。
*/
#include "stdafx.h"
#include"stdio.h"
int main(int argc, char* argv[])
{
char c;
int i,data=0;
printf("Input char:");
for(i=0;i<4;i++)
{
c=getchar();//输入一数字字符。
if(c<'0'||c>'9')//判断输入字符是否在'0'~'9'范围内。
break;
data=data*10+c-'0';//计算当前数据值。
}
printf("data=%d/n",data);
return 0;
}
参考:http://www.xuebuyuan.com/1854888.html
=========================================================
C++中怎样在输入流中区别int类型和字符类型?(进一步的问题,有补充浮点数的情况)
在实际测试中,使用@whistler 君及@精英王子 君的方法时,的确可以识别字符类型(如a,+等),但若输入浮点数类型(如1.2)仍然会跳出循环进入下一步。而我希望的是除了某几个特定整数(如1,2,3)外其他所有的非法输入都能给出报错结果并且不影响重复输入,如果能对不同的错误(字符,非要求整数,浮点数)提示不同的信息则更佳。请问诸位如何解决浮点数输入时跳出报错循环的情况?另外既然跳出了循环那x的值是几呢(经测试,输入1.2,值为1)?算是强制类型转换吗?
-----------------------原问题---------------------------------------------------------------------
有一个位置我需要输入整数,int x;cin>>x,若故意输入一个字符,则此处会无限循环。请问如何在输入为字符时(如a)将其分辨出来以给出错误信息呢?多谢诸位高手。
-----------------------------------------------------------------------------------------------------
把@whisky 君的方案贴一下,未授权,望谅解。
int read(){
char c;
while( c= getchar(), !isdigit(c) );
int r= c-'0';
while( c= getchar(), isdigit(c) ) r= r*10 + c-'0';
return r;
}
这个是我平时写题目用的读入优化能自动判断字符和数字。只不过没有警告功能。要警告的话。。可能是这样的。
int read(){
char c;
while( gets(&c))
{
if(!isdigit(c))cout<<"NAN";
else break;
}
int r= c-'0';
while( c= getchar(), isdigit(c) ) r= r*10 + c-'0';
return r;
} 第二个没调过不知道能不能用- -
7条讨论|修改记录
随鸟走天涯
精英王子高中退学,独立开发者,独立博客作者,深度 Git...
2012-06-19 21:09#include <iostream>
using namespace std;
int main()
{
int num;
cin.clear();//清空上次的错误信息
cin>>num;//在这里我们期望输入一个数字
if(cin.good()) //如果成功了
{
cout<<"你输入的数字是"<<num<<endl;
}
else //如果没成功(输入的不是数字)
{
cout<<"输入有误"<<endl;
cin.ignore();//丢弃缓冲区中错误的输入
}
}
//------------分割线--------------
#include <iostream>
using namespace std;
int main()
{
int num;
//如果我们要用户输入一个数字,可以这么做:
cout<<"请输入一个数字:";
while(true) //一直循环
{
cin.clear();//清空上次的错误信息
cin>>num; //从键盘读取输入
if(cin.good()) //如果成功了
break; //退出循环
else
{
//下一句是丢弃缓冲区中错误的输入
//这很重要,否则错误的输入会一直留在缓冲区里面,导致程序死循环
cin.ignore();
cout<<"输入有误,请重新输入:";
}
}
//到这里,num里面就是一个有效的数字了
cout<<"你输入的数字是"<<num<<endl;
}
3条讨论
whistler软件工程学生、Python爱好者
2012-06-19 21:11
cin>>x自身会返回状态的
cin.sync()是清空缓冲区
cin.clear()是清除cin可能的出错状态
以上代码均在std命名空间里面跑的~
添加讨论
we_cry空间信息与数字技术专业
2012-06-19 20:51我记的 @精英王子 做过一个关于判断这是不是数字的,具体内容忘记了。。。
p.s. 这里有一个: http://technet.microsoft.com/zh-cn/library/078sfkak.aspx
参考:
http://www.guokr.com/question/237697/
控制台和端口 I/O
这些例程读写在控制台上或指定端口。 控制台 I/O 例程与流 I/O 或底层 I/O 库类型程序兼容。在执行 I/O之前,不必打开控制台或端口或关闭,因此此类别中打开或关闭的例程。在 Windows 操作系统中,这些函数的输出始终处理到控制台,不能重定向。
例程
使用
_cgets, _cgetws,_cgets_s、_cgetws_s。
从控制台读取字符串
_cprintf,_cwprintf,_cprintf_s、_cprintf_s_l、_cwprintf_s、_cwprintf_s_l
将格式化的数据写入控制台。
_cputs
把字符串写入控制台
_cscanf,_cwscanf,_cscanf_s、_cscanf_s_l、_cwscanf_s、_cwscanf_s_l
从控制台读取格式化的数据
_getch、_getwch
从控制台读取字符
_getche、_getwche
从控制台读取字符以及回显它
_inp
从指定的I/O端口读取一个字节
_inpd
从指定 I/O 端口读取双字
_inpw
读取指定 I/O 端口 2 字节的单词
_kbhit
在控制台检查键击;在尝试从控制台读取使用
_outp
写入字节到指定 I/O 端口
_outpd
对指定的 I/O 端口的写双字
_outpw
对指定的 I/O 端口的写字节
_putch、_putwch
向控制台写入字符
_ungetch,_ungetwch
“Unget”是从控制台读取的最后一个字符,所以它是下一个要被读取的字符。
请参见
参考
参考:
如何从键盘输入字符型的数字 谷歌
- 如何从键盘输入数字字符|只有在输入完数据再按回车键后,该行数据才被送入内存上的键盘缓冲区里,形成输入流
- 从键盘输入若干行字符(每行长度不等),输入后把它们存储到一磁盘文件中,再从该文件中读入这些数据,将其中小写字母转换成大写字母后显示在屏幕上
- java 接收从键盘上输入的数据,保存到文本文件里
- 如何在执行raw_input()之前清除输入缓冲区的数据
- 汇编语言: 从键盘上输入一串字符(用回车键结束,使用10号功能调用。),将其中的小写英文 字母变换为大写英文字母,其他字符保持不变。然后将变换后的字符串显示出来。
- 3.定义10个字节的键盘缓冲区,然后键盘输入字符填满该缓冲区,做如下工作: (1)分别将输入键盘缓冲区的字符按数字,小写字母,大写字母,其他字符进行计数; 分别将这些计数值显示出来。 (2)分别将这
- 只有数字字符的用户输入
- 从键盘上输入3个整型数据
- 从键盘上输入3个整型数据
- 编写一个程序读入一行输入,然后反向打印该行,您可以把输入存储在一个char数组中: 假定该行不超过255个字符。回忆一下,您可以使用具有%c说明符的scanf()从输入中一次 读入一个字符,而且当您按下回车键时会产生换行符(/n)
- 汇编语言: 从键盘上输入一串字符(用回车键结束,使用 10 号功能调用。)放在 STRING 中,试 编制一个程序测试字符串中是否存在数字。如有,则把 CL 的第 5 位置 1,否则将该位置置 0。
- 关于C语言使用输入函数后键盘缓冲区还有多余字符没的问题
- UITextField只有当有字符输入后,键盘右下角的搜索/返回/done/等等键才可
- 汇编语言: 从键盘上输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,
- 编写程序从键盘上输入一些字母和数字,统计显示其中的数字字符的个数和非数字字符个数。
- 找出从键盘上输入的3个实型数据中的最大值。
- 在键盘输入文字时,如何判别只输入数字类型?
- c语言从键盘上输入一串字符串,输入两个数字a和b,截取字符串第a个到第b个字母,并输出截取后的字符串
- 自定义progressdialog——带倒计时的progressbar效果
- 人脸姿态识别
- 关于工资的三个秘密
- CRAMFS镜像制作
- 如何通过反编译工具与插件 查看java *.class 文件源码
- 如何从键盘输入数字字符|只有在输入完数据再按回车键后,该行数据才被送入内存上的键盘缓冲区里,形成输入流
- 撤销正在审核的和已经通过审核的app
- GdiPlus清理椭圆区域锯齿
- android的网络与通讯
- 动态规划
- [Unity3D]再次点击以退出程序
- Mac下修改Mysql数据库密码,忘记密码
- Div+CSS网页制作误区
- 轻松实现Android登录Demo