简短谈谈cin,scanf,getline的用法
来源:互联网 发布:单片机与嵌入式的区别 编辑:程序博客网 时间:2024/04/28 04:09
以前做题的时候,往往在一些输入上很讲究,但是当时对cin,scanf 和getline的用法不是很清楚,弄的束手无策,
结果去google,百度,讲的也不是特别的详细,经过自己的研究,终于弄懂了这些的用法,先上一道题吧,真是水题,这种就是在输入上做文章
题目: 输入为字典对应,前面的是value,后面的是key,空一行,接着是查询key,输出为key所对应的value,
如果不存在则输出为eh。如图。
这道题目还是比较简单的,只是对于输入来说是个难点,因为不知道何时输入结束,虽说空了一行,但是如果对于cin,scanf,getline等函数不熟的话,在写代码的时候会遇到很多问题,熟的话,几分钟搞定这道题。
之所以我想写这篇文章,是因为我看了一些百度文库后发现里面的讲的并不是完全正确。
先说说scanf吧,如果是读字符的话,任何字符它都是会读取的。看一个例子:
#include <iostream>#include <cstdlib>#include <string>using namespace std;int main() { int a, b; char c1, c2, c3; string str; scanf("%c%c%c",&c1, &c2, &c3); cout << c1 << c2 << c3; system("pause"); return 0;}
我输入的是 空格 + 1 + 回车 ,结果输出的也是空格 + 1 + 回车,可见scanf读取字符的时候是通吃的。
cin.get()是读取单个字符的和scanf读取单个字符是完全一样的,也是通吃型的。
再说scanf读取字符串的情况:
#include <iostream>#include <cstdlib>#include <string>using namespace std;int main() { int a, b; char c1, c2, c3; char str1[10], str2[10], str3[10]; scanf("%s%s%s", str1, str2, str3); c1 = cin.get(); cout << str1 << str2 << str3; cout << c1; system("pause"); return 0;}
我输入的是 空格 + 111 + 空格 + 222 + 空格 + 333 + 回车,结果输出是 111222333+回车 ,这说明scanf读取字符串的时候,从第一个非空白字符开始读取,直到遇到空白字符结束,但是它并不会读入空白字符,也就是说,最后的
的回车符他是没读取进去的也不会丢掉,结果用cin.get()读取赋值给了c1。
cin读取字符串的用法跟scanf读取字符串的方式是一样的。
getline是读取整行字符串的(开头的空白字符也会照样读取),我们关心的是它到底有没有读取最后的换行符,来看一个例子:
#include <iostream>#include <cstdlib>#include <string>using namespace std;int main() { int a, b; char c1, c2, c3; string s; getline(cin,s); cout << s; c1 = cin.get(); cout << c1; system("pause"); return 0;}
我输入输入 1111111 + 回车 结果是输出 1111111 后面还在等待输入(c1=cin.get() ),由此可知,换行符是被读取掉了,并且丢掉了
下面在说说读取的机制,看到网上说有一段缓冲区,保存着从键盘输入的字符,那究竟从什么时候cin,scanf这些从缓冲区读取呢?答案应该是你输入回车的时候。看看一个例子:
#include <iostream>#include <cstdlib>#include <string>using namespace std;int main() { string s; while (1) { cin >> s; cout << s; } system("pause"); return 0;}
我输入的是 111 + 222 + 333 + 回车 接着它就输出 111222333,我在输入空格 + 4444 + 回车,它输出 4444 ,由此证明观点是正确的。
说到这里,我想第一题应该很容易就可以做出来了。
总结一下:
scanf 读取单个字符的时候,是通吃型的,空白字符也会读取;读取字符串的时候,从第一个非空白字符读起,遇到空白字符结束,不读入空白字符cincin.get()和scanf读取单个字符是一样的,cin读取单个字符时,从非空白字符读起,遇到空白字符结束,不读入空白字符;读取字符串时,从非空白字符读起,遇到空白字符结束,不读入空白字符getline读取整行的字符串,开头的空白字符也会读取,遇到行尾结束,行尾的回车符也会读取掉,并且丢弃掉了以上纯属自己百度google之后,总结出来的经验。有问题望大家提出。
- 简短谈谈cin,scanf,getline的用法
- gets,scanf,getchar,cin.getline的用法
- C++:cin、cin.getline()、getline()的用法
- cin、cin.getline()、getline()的用法
- C++:cin\cin.getline()\getline()的用法
- cin , cin.get() , cin.getline() , getline() , cin.ignore() 的用法
- cin、cin.get()、cin.getline()、getline()、gets()函数的用法
- cin、cin.get()、cin.getline()、getline()、gets()函数的用法
- cin、cin.get()、cin.getline()、getline()、gets()函数的用法
- cin、cin.get()、cin.getline()、getline()、gets()函数的用法
- cin、cin.get()、cin.getline()、getline()、gets()函数的用法
- cin、cin.get()、cin.getline()、getline()、gets()函数的用法
- cin、cin.get()、cin.getline()、getline()、gets()函数的用法
- cin、cin.get()、cin.getline()、getline()、gets()函数的用法
- cin、cin.get()、cin.getline()、getline()函数的用法
- gets() getline() scanf() cin
- hdu1048及cin.getline,getline的用法
- cin ,getline的用法总结
- android 随手记 dom解析
- 探索并发编程(七)------分布式环境中并发问题
- LPCTSTR和CString的关系
- TextView写好了style 行数为两行。但是只显示一行
- Linux驱动开发hello world
- 简短谈谈cin,scanf,getline的用法
- 正则表达式练习
- Log4J 在系统运行时更改log4j的配置
- 我的SSH之旅 (1) : 开发环境的搭建
- html中加载flash方法
- 小五步解决android-support-v4关联源码的问题解决
- http与https的区别
- Android Bitmap内存溢出
- 求1!+2!+...+20!的和