[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!='\n')
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


    

    

 

 

posted @ 2013-09-04 18:18  七年之后  阅读(1573)  评论(0编辑  收藏  举报