sb ????//这个换行sb是我endl一下产生的,原先的回车已经被getchar掉了。
??
但是scanf在同样的代码下表现就不一样了,scanf在读取时是忽略内存大小的,我们看:
short b = 0;
scanf("%hd",&b); ??//short decimal 所以这是hd 输入656563
printf("%x", b);
if (getchar() == '\n') {
printf( "is space!");
printf("\n");
}
printf("%s","sb");
控制台界面:
656563
4b3is space! ????//656563的实际转16进制是a04b3 可见scanf对于溢出有些问题
sb
??
(2)??cin.get()函数:
这个与C语言当中的getchar()是一模一样的,就是读一个字符,语法是:char b=cin.get();或者cin.get(b);但拓展了新用法可以接收字符串,语法是 cin.get(字符数组,长度),参数中长度比实际读取长度大1.
代码:
char??a[20];????//该值不可以比读入的位数小,否则会崩溃
cin.get(a, 15);??//即使输入的内容若太短,会提前截止,结尾的\n也不会进入字符串
cout <<??a;
??
控制台界面:
0123456789 0123456789 0123456789
0123456789 0123请按任意键继续. . . ??//读取15-1=14个字符,最后一个以‘\0’填充

??
(3)??cin.getline()函数
用于读取一个字符串,与cin.get()函数不同,这个函数在读取结束后会删除缓冲区当中的\n
代码,与C语言的gets函数是一致的:
char??a[20];
cin.getline(a, 5);??????//输入12345
cout <<??a;
if??(cin.get() == '\n') {
cout <<??"stupid"??<<??endl;
}??????????????????????????????????????????//若使用get函数会只出现一个 stupid而不是两个或更多
if??(cin.get() == '\n') {
cout <<??"stupid"??<<??endl;??????//用getline则一个stupid都没有
}
控制台界面:
12345
1234请按任意键继续. . . ??//实际读取了4个字符,自己增加一个‘\0’
PS:C++当中也有getline()函数,这是在<string>头文件下包含的一个函数,功能与cin.getline()是一样的。scanf输入字符串
(4)??
三、Java读取各种形式的数据
Java的读数据应该是最简单的了,基本的形式是:
Scanner input=new??Scanner(System.in);????//参数为任一输入流
Input对象具有next,nextLine,nextInt,nextDouble,hasNext,hasNextLine,hasNextInt,hasNextDouble,这配套的四对方法。
Java当中没有cin和scanf这样先确定好变量再读入数值的方法,统一采用get/getline的逻辑,也就是只读取不管赋值,并且在C++字符和字符串的基础上改为了读入不带空格的字符串(next),带空格的字符串(nextLine),整数(nextInt)和浮点数(nextDouble),对于单个字符的读取需要切割字符串实现。所有的输入输出方法不需要再管C语言当中的末尾回车键了。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-81056-2.html
果然全宇宙最火
二炮部队演习