C++ cin get getline详细
cin 字符串的输入
1 cin >> 输入是标准输入流对象 读取数据是通过键盘进行输入 cin>> 读取时 只能读取想要的数据类型
!!!!但是不能读取空格和换行符
但是cin读取是怎么知道读取完的呢 是通过空白(空格、制表符和换行符)来确定的字符串的结束位置
也就说当我们想输入这种 New York时 cin只能读取到New 因为有空格 York会留在缓冲区
int a = 0;
cin >> a;//这里如果你输入其他类型的 比如在键盘上输入A 在cin >> 是无法读取的 A会留在缓冲区 然后等待读取
char c;
cin >> c;.//这个时候才会读取A 但是不会读取空格和换行符 会跳过
针对这种问题 有两种方式来解决这种问题:
通过每次读取一行字符串输入
cin.getline() 和cin.get() getline() `
这两个是istream中的类 cin 的成员函数 两个面向行的成员函数 这两个函数都是按行读取 直到达到换行符就停止读数
区别
getline() 在读取时会丢弃换行符 however 当get() 在读取时会将换行符留在输入序列中
1 面向行的输入:getline()
getline()可以通过cin.getline()调用 会在按下回车后读取到换行符就停止读取 或者读取到了指定字符数就停止
该函数有两个参数 第一个参数就是你读取的数据想要放的数组 第二个参数就是想要读取的字符数
比如想要读取20个字符 最多只能读取19个 剩下的空间要自动在结尾处添加空字符
就是假设将姓名读入到一个包含20个元素的name数组中 可以这样写 代码如下
char name[20];
cin.getline(name,20);
这样就解决了只能读取一个字符不能识别空格的问题
getline()是每次读取一行 通过换行符来确定行尾 但是不保存换行符 相反 存储字符串是用空字符代替换行符 在结尾处 就是读取到换行符 会转换成为空字符 ‘\0’
2 面向行的输入:get()
1 通过get输入的时候 我们输入完毕会按下回车 回车会被识别为换行符(\n)存储在输入缓冲区中 get会识别 认为输入结束 如果输入的是abcd 按下回车也就是换行符也会被识别 所以字节个数其实是5
2 如果你下一行还要通过get进行输入是无法进行输入的 因为按下回车也就是换行符会留在输出序列中 然后被第二个get识别到 由结论1可知第二个get无法再进行输入
char name[20];
char age[20];
cin.get(name, 20);//get会保留最后的换行符 就是你输入之后按一下回车 这样两个连在一起 第一个调用后 换行符会留在输出队列中
cin.get(age, 20);//导致在这里再进行输入的时候 第一个识别的是换行符 换行符就是意味着队尾 它无法跳过 所以不能再进行输入
根据这个问题 也有两种解决办法
1 是在这两个中间加一个cin.get()来读取留在输入序列中的换行符
char name[20];
char age[20];
cin.get(name, 20);
cin.get();//读取留在输入序列中的换行符
cin.get(age, 20);
2 是如下的代码
之所以可以这样写 是因为cin.get()返回的是一个cin对象 然后再调用一次成员函数get()
char name[20];
char age[20];
cin.get(name, 20);
cin.get(age, 20);
cin.get(name, 20).get(age, 20);//连续调用
3 getline()和get()遇到空行或其他问题
现在的做法是当get()(不是getlin())读取空行后将设置失效位(failbit) 这意味着接下来的输入将被阻断
但是可以通过下面的命令恢复
cin.clear();
另一个问题就是如果字符串长度比分配的空间长,如果输入的比指定的参数多,则这两个成员函数会将多的留在输出队列中,而getline()会设置失效位,并关闭后面的输入
其中一些资料来自于C++ Primer Plus