zoukankan      html  css  js  c++  java
  • cin/cout与scanf/printf的比较

    转自http://www.cnblogs.com/penelope/articles/2426577.html 

    cin 、cout    

     基本说明:

      cin是标准输入流对象,代表标准输入设备(键盘),使用方法:cin >> 变量。功能:数据通过输入设备放在缓存区,cin从缓存区中读出数据存到变量中。

      cout是标准输出流对象,代表标准输出设备(显示器),使用方法:cout << 变量。功能:从变量中读取数据放入缓存区,然后经输出设备显示数据。

      cincout,重载了">>"、"<<"运算符,包含在头文件<iostream>中。

      先把要输出的东西存入缓冲区,再输出,导致效率降低,cin是自动判断你的变量类型,比如一个char数据只能用默认的char方法取数据。

    scanf 、printf

     基本说明:

      scanf是格式化输入,printf是格式化输出,包含在头文件<stdio.h>中。

      因为scanf是用指针操作的,没有类型安全机制,比如一个char类型数据你就可以用%f获得输入,而不会报错,但在运行时会出现异常。

      scanf()函数取数据是遇到回车、空格、TAB就会停止。比如:

    #include <stdio.h>
     int main()
     {
      char str1[20], str2[20];
      scanf("%s",str1); 
      printf("%s\n",str1);    
      scanf("%s",str2); 
      printf("%s\n",str2); 
      return 0;
      }

    测试一输入:
    Hello world!
    输出:
    Hello
    world!

    第一个scanf()会取出"Hello",而"world!"还在缓冲区中,这样第二个scanf会直接取出这些数据,而不会等待从终端输入。

    为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
      方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
             这个函数是fflush(stdin)。
      方法2:自己取出缓冲区里的残留数据。
      (说实话这个语句我也没看懂,呵呵!为什么格式控制是这样的!希望高手指点一下!)
             scanf("%[^\n]",string);

    gets()

     基本说明:

      gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符。包含在头文件<stdio.h>中。

      gets(s)函数与 scanf("%s",&s) 相似,但不完全相同,使用scanf("%s",&s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。

    原型:

      char*gets(char*buffer);

    #include <stdio.h>
    int main()
    {
      char str1[20], str2[20];
      gets(str1); 
      printf("%s\n",str1);    
      gets(str2); 
      printf("%s\n",str2); 
      return 0;
    }
    测试:
    Hello world! [输入]
    Hello world! [输出]
    12345 [输入]
    12345 [输出]

     

    为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
      方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
             这个函数是fflush(stdin)。
      方法2:自己取出缓冲区里的残留数据。
      (说实话这个语句我也没看懂,呵呵!为什么格式控制是这样的!希望高手指点一下!)
             scanf("%[^\n]",string);

    输入操作的原理

    与前一节中提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入,这就是例子中为什么会出现输入语句失效的原因!

    cin的一些输入函数和操作符

    cin is a extern istream object。提供了很多可用的成员函数和重载的操作符,如:cin<<, cin.get(),   cin.getline()等。下面我们来了解一下这几个函数:

    一. cin<<

    该操作符是根据后面变量的类型读取数据。

    输入结束条件   :遇到Enter、Space、Tab键。

    对结束符的处理 :丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)

      

    二.cin.get()

    该函数有三种格式:无参,一参数,二参数

    即cin.get(), cin.get(char ch), cin.get(array_name,   Arsize)

    读取字符的情况:

    输入结束条件:Enter键

    对结束符处理:不丢弃缓冲区中的Enter

    cin.get() 与 cin.get(char ch)用于读取字符,他们的使用是相似的,

    即:ch=cin.get() 与 cin.get(ch)是等价的。

     

    读取字符串的情况:

    cin.get(array_name, Arsize)是用来读取字符串的,可以接受空格字符,遇到Enter结束输入,按照长度(Arsize)读取字符, 会丢弃最后的Enter字符。

    程序6:

    #include <iostream>

    using namespace std;

    int main ()

    {

    char a[20];

    cin.get(a, 10);

    cout<<a<<endl;

    return 0;

    }

    测试一输入:

    abc def[Enter]

    输出:

    abc def

    【分析】说明该函数输入字符串时可以接受空格。

    测试二输入:

    1234567890[Enter]

    输出:

    123456789

    【分析】输入超长,则按需要的长度取数据。

    程序7:

    #include <iostream>

    using namespace std;

    int main ()

    {

    char ch, a[20];

    cin.get(a, 5);

    cin>>ch;

    cout<<a<<endl;

    cout<<(int)ch<<endl;

    return 0;

    }

    测试一输入:

    12345[Enter]

    输出:

    1234

    53

    【分析】第一次输入超长,字符串按长度取了"1234",而'5'仍残留在缓冲区中,所以第二次输入字符没有从键盘读入,而是直接取了'5',所以打印的ASCII值是53('5'的ASCII值)。

    测试二输入:

    1234[Enter]

    a[Enter]

    输出:

    1234

    97

    【分析】第二次输入有效,说明该函数把第一次输入后的Enter丢弃了!

      

    三.cin.getline()

    cin.getline() 与 cin.get(array_name, Arsize)的读取方式差不多,以Enter结束,可以接受空格字符。按照长度(Arsize)读取字符, 会丢弃最后的Enter字符。

    但是这两个函数是有区别的:

    cin.get(array_name,   Arsize)当输入的字符串超长时,不会引起cin函数的错误,后面的cin操作会继续执行,只是直接从缓冲区中取数据。但是cin.getline()当输入超长时,会引起cin函数的错误,后面的cin操作将不再执行。(具体原因将在下一部分"cin的错误处理"中详细介绍)

    程序8:

    #include <iostream>

    using namespace std;

    int main ()

    {

    char ch, a[20];

    cin.getline(a, 5);

    cin>>ch;

    cout<<a<<endl;

    cout<<(int)ch<<endl;

    return 0;

    }

    测试输入:

    12345[Enter]

    输出:

    1234

    -52

    【分析】与cin.get(array_name, Arsize)的例程比较会发现,这里的ch并没有读取缓冲区中的5,而是返回了-52,这里其实cin>>ch语句没有执行,是因为cin出错了!

  • 相关阅读:
    汇编语言 第二单元 整理
    iOS10推送必看UNNotificationServiceExtension
    RSA加,解密
    添加购物车动画
    长按移动cell
    http live streming
    修改工程
    searbar
    tableView 编辑模式
    iOS 3D touch
  • 原文地址:https://www.cnblogs.com/zhanghu52030/p/6923957.html
Copyright © 2011-2022 走看看