zoukankan      html  css  js  c++  java
  • [C++]iostream的几种输入形式

          做ACM题的时候,发现cin并不能满足所有输入要求。比如说:

          每行给出一款运动鞋信息,若该款写不打折,则先后给出每种运动鞋单价P,所购买的数量Q;若打折,则先后给出每种运动鞋单价P,所购买的数量Q,折扣率C%,最后求买鞋需付多少钱。

          样例输入:

          346 2

          271 5 50%

          样例输出:

          1369.50

          这个时候如果还是用cin就略显无力了,因为系统并不知道你输入的第三个数到底是折扣率还是单价。  

          所以呢,在这里对C/C++的输入操作做个系统地学习。(以下是本人的理解,若有错误还请多多指教)

    1.cin

          输入结束条件:enter、space、tab

          对结束符的处理:丢弃缓冲区中使得输入结束的结束符(enter、space、tab)

    1 int main()
    2 {
    3     string s;
    4     cin>>s;
    5     cout<<s<<endl;
    6     return 0;
    7 }

          输入:Hello world!(或者Hello  World!中间为tab)

          输出:Hello

    2.cin.get()

          有4种形式,无参数char ch=cin.get()等价于有一个参数cin.get(char ch),3个参数cin.get(char array[],int length,char ch),无第三个参数也就是说只有前两个默认enter键结束。

          a.读取字符

          输入结束条件:enter

          对结束符处理:不丢弃缓冲区中的enter(**)

     1 int main()
     2 {
     3     char ch1,ch2;
     4     cin.get(ch1);
     5     cin.get(ch2);
     6     cout<<ch1<<" "<<ch2<<endl;
     7     cout<<(int)ch1<<" "<<(int)ch2<<endl;
     8 
     9     return 0;
    10 }

          输入:a
          输出:a

                   97 10

         (输出第一行为a,第二行为换行,第三行为a,enter的ASCII值。)

          有了对cin.get(),本文一开始的问题就迎刃而解了,因为用cin.get(),缓冲区不会丢弃enter,所以呢,当输入完P和Q我们只要判断一下接下来输入的是不是enter,就可以知道到底有没有折扣了。

    1 cin>>a>>b;
    2 if((cin.get(ch)&&ch!='
    ')
    3 {
    4      cin>>c;
    5      ...
    6 }

          b.读取字符串
          输入结束条件:默认enter,(因此可接受space、tab),自定义第三个参数

          对结束符处理:丢弃缓冲区的enter

     1 int main()
     2 {
     3     char s[20];
     4     char ch;
     5     cin.get(s,5,'c');//这里5代表输入长度,c为结束字符
     6     cin>>ch; 7     cout<<s<<endl;
     8     cout<<(int)ch<<endl;
     9     return 0;
    10 }

          输入1:12345
          输出1:1234
                     53

          (12345超长,字符串按长度去“1234”,5在缓冲区,所以还没有键盘输入,ch直接取‘5’)

          所以这里补充一下:程序的输入都建有一个缓冲区,当一次键盘输入结束时会将输入的数据次纳入输入缓冲区,而cin函数直接从输入缓冲区中取数据。所以当缓冲区中有残留数据是,cin函数会直接取得这些残留数据而不会请求键盘输入。
          输入2:abcde
          输出2:ab
                    99
          (自定义结束符时,不丢弃缓冲区中的结束符

    3.cin.getline()

          与cin.get()不同的是,cin.get()当输入的字符串超长时,不会引起cin函数的错误,cin操作继续进行,从缓冲区中取数据,就像上面的例子一样。但是cin.getline()当输入超长是,会引起后面的cin操作不再执行。

          还是上面的程序(将cin.get()改为cin.getline),输入不变

          输出:1234
                   -52

          输出ch不再是‘5’,显然cin并没有操作。

    参考:

    1.http://blog.csdn.net/dongtingzhizi/article/details/2299358

    2.http://www.cnblogs.com/A-Song/archive/2012/01/29/2331204.html

    3.http://blog.csdn.net/dongtingzhizi/article/details/2299365


        

        

  • 相关阅读:
    php 建立类POST/GET 的HTTP请求
    上传文件
    golang精选100题带答案
    go面试
    golang反射
    go语言中type的几种使用
    写个版本迭代的方法 例如1.0.9 迭代为1.1.0 到10自动往前进1
    压缩文件和解压文件
    go语言中的文件创建,写入,读取,删除
    go面试题
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3301615.html
Copyright © 2011-2022 走看看