简短谈谈cin,scanf,getline的用法(转载)

 以前做题的时候,往往在一些输入上很讲究,但是当时对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                               读取单个字符的时候,是通吃型的,空白字符也会读取;读取字符串的时候,从第一个非空白字符读起,遇到空白字符结束,不读入空白字符
cin cin.get()和scanf读取单个字符是一样的,cin读取单个字符时,从非空白字符读起,遇到空白字符结束,不读入空白字符;读取字符串时,从非空白字符读起,遇到空白字符结束,不读入空白字符
getline 读取整行的字符串,开头的空白字符也会读取,遇到行尾结束,行尾的回车符也会读取掉,并且丢弃掉了
posted @ 2018-08-20 20:19  南柯一场  阅读(588)  评论(0编辑  收藏  举报