简短谈谈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之后,总结出来的经验。有问题望大家提出。