C++中输入注意点(cin,cin.getline(),cin.get())

1.每次只读取一个单词(cin):cin使用空白(空格,制表符和换行符)来确定字符串的结束位置,这意味着cin在获取字符数组输入时只读取一个单词,读取该单词后,cin将该字符串放到数组中,并自动添加空字符-"\0",而不保存上述的结束符,会忽略上述结束符,cin可以重新读取一个单词。

2.每次读取一行字符串输入

(1)getline():每次只读取一行,通过回车键输入的换行符来确定输入结尾,但不保存换行符。相反,在存储字符串时,它用空字符来替换换行符。例如:cin.getline(name,20);

(2)get():与上述类似,不同的是get并不丢弃换行符,而是将其留在输入队列中。

3.cin.clear() :清空输入数据时的异常状态标志,使接下来的数据正常输入 。

注意点:

1)先来看一看利用cin读取字符串

cin使用空白(空格、制表符、换行符(通过回车符输入))来确定字符串的结束位置,这意味着通过cin读入字符数组时只读取一个单词空白仍保留在流中,读取该单词后,cin将该字符串放在数组中,并自动在结尾加入空字符(‘\0’)流中单词之前的空白将被忽视,而直接保存单词;单词之后的空格仍保存在流中!

2)再看看cin.getline(char*,int)读取字符串

cin.getline(char*,int)将int-1个字符读取到数组char*中,最后一个位置用来存储'\0'。该函数在读取指定数目的字符或者遇到换行符时停止读取。该函数从流中抽取出换行符,但不保存换行符还可以getline(cin,char*),比较常用不需要知道长度。

3)再看看cin.get(void)读取字符串

cin.get()往往用来从流中抽取换行符,防止下一次读入时因读入换行符而提前结束。往往和get(a,b)结合使用,因为get(a,b)不从流中抽取换行符

4)再看看cin.get(a)读取字符串(一个引用类型参数

cin.get(ch)该读取方法可以补救cin读取方法的缺点,即可以将空白读入并存储,但是该方法只能一个字符一个字符读取,往往对于字符串的读取不太方便,故用的较少。

5)再看看cin.get(char *,int)读取字符串(两个参数)

cin.get(char*,int)与cin.getline(char*,int)函数很相似,唯一不同的地方在于:get函数不从流中抽取换行符,换行符仍保留在流中,因为其后往往要跟cin.get(),用来抽取换行符。

补充:

     cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。 

       使用一个istream的对象作为条件时,效果是检查流的状态。若流有效,则检测成功,返回true。当遇到文件结束符或者无效的输入(比如用一个字符来作为一个整型数的输入时),istream的对象状态会变为无效。

总而言之:

(1)  输入数据时需要敲回车键才能将数据送到缓存器,cin才能读取缓存区的数据。

(2) 当cin遇到文件结束符(windows中为:ctrl +Z , Unix 中为:ctrl +D),或无效输入才能使cin状态无效。

例如: cin 作为while条件

//使用动态数组来做,输入的数字依次存入数组中,
//最后返回数组中最后一个数字
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int  main ()
{
    int a;
    vector<int> arr;
    while(cin>>a)
    {
        arr.push_back(a);
    }
    cout<<arr[arr.size()-1]<<endl;
    return 0;
}

 

 

输入一组数据,其中含有非法字符,按下回车之后,cin开始从缓冲区读取数据,读到非字符数字之后,因为与原int类型不匹配,cin返回false就会结束循环,所以最后一个数字为345;如果全是数字字符,类型匹配则会一直循环读取。(但该方法不常用,一般不作为结束条件)

因为cin会忽略回车键,所以直接回车键是不能跳出循环的,解决方法如下:

方法一:回车,然后使用ctrl+z,然后再回车即可结束输入,跳出循环

具体原因请移步:http://www.cnblogs.com/wangyichao/p/3525173.html

方法二:if (getchar() == '\n')  break//通过回车判断跳出循环,如果没有该语句跳不出循环,因为cin会忽略跳过回车键

 

有关cin的详细说明:http://blog.csdn.net/k346k346/article/details/48213811

设有语句cin>>hex>>a>>oct>>b>>dec>>c;若输入12,12,12cin执行后,为什么abc的值分别为18,10,12?

hex 是16进制,oct是8进制,dec是10进制,你输入3个都是12.
16进制12转成10进制是18,8进制12转成10进制是10,10进制12转成10进制是12.
其实cin是一个对象,而>>是重载的操作符,你可以把>>理解为函数即cin.>>(hex),把hex作为参数。这样cin这个对象就设置里面的成员变量的值,让它接收输入时能按16进制输入,即把输入的12当成16进制的12.执行完后会返回cin的引用,知道引用吧,从反汇编看它是返回一个指针值,
就是指向cin自己,这样当再次用>>时又能调用cin.>>(a)连续用>>调用,能获得连续输入。
16进制12转成10进制是18,8进制12转成10进制是10,10进制12转成10进制是12.
其实cin是一个对象,而>>是重载的操作符,你可以把>>理解为函数即cin.>>(hex),把hex作为参数。这样cin这个对象就设置里面的成员变量的值,让它接收输入时能按16进制输入,即把输入的12当成16进制的12.执行完后会返回cin的引用,知道引用吧,从反汇编看它是返回一个指针值,
就是指向cin自己,这样当再次用>>时又能调用cin.>>(a)连续用>>调用,能获得连续输入。

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值