如何从键盘输入数字字符|只有在输入完数据再按回车键后,该行数据才被送入内存上的键盘缓冲区里,形成输入流

来源:互联网 发布:睡了很久还是困 知乎 编辑:程序博客网 时间: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以内的数字字符

2014年02月25日 ⁄ 综合⁄ 共 471字 ⁄ 字号小中 大评论关闭

 从键盘输入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条讨论|修改记录

随鸟走天涯

推荐  (0) |
收藏 |
1人关注关注
7个答案
30

精英王子高中退学,独立开发者,独立博客作者,深度 Git...

2012-06-19 21:09
支持者: whistler随鸟走天涯we_cry

#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条讨论

20

whistler软件工程学生、Python爱好者

2012-06-19 21:11
支持者: 精英王子随鸟走天涯


cin>>x自身会返回状态的
cin.sync()是清空缓冲区
cin.clear()是清除cin可能的出错状态
以上代码均在std命名空间里面跑的~

添加讨论

00

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

Visual Studio 2013

这些例程读写在控制台上或指定端口。 控制台 I/O 例程与流 I/O 或底层 I/O 库类型程序兼容。在执行 I/O之前,不必打开控制台或端口或关闭,因此此类别中打开或关闭的例程。在 Windows 操作系统中,这些函数的输出始终处理到控制台,不能重定向。

控制台和端口 I/O例程。

例程

使用

_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”是从控制台读取的最后一个字符,所以它是下一个要被读取的字符。

请参见

参考

输入和输出
按类别分的运行时例程
https://technet.microsoft.com/zh-cn/library/7x2hy4cx.aspx

参考:

如何从键盘输入字符型的数字 谷歌

0 0
原创粉丝点击