cin
- 跳过 Space,Tab,Enter
- 跳过Enter 后仍将Enter 保留在缓冲区中
cin.get()
- cin.get(char* s(读入数据储存区),streamsize(读入数据大小),char delim(终止符,默认Enter))
- 如果缓冲区字符数超过了streamsize,则函数会继续读入,并不会停止;
- 当遇到终止符时,函数不会读取终止符,终止符仍在缓冲区中;
注意
:如果第一个字符就是终止符,则函数会设置错误位;
cin.getline()
- cin.getline(char* s(读入数据储存区),streamsize(读入数据Enter大小),char delim(终止符,默认Enter))
- 如果缓冲区字符超过了streamsize,则函数不仅会停止读入,而且会设置错误为;
- 函数会丢弃遇到的终止符;
注意
:
- 如果第一个字符就是终止符,函数不会设置错误位;
- 针对第2点的一个说明(看下面的
代码
:)
//
#include<bits/stdc++.h>
using namespace std;
int main()
{
char *one;
one = new char[1];
//two=char[1];
cin.getline(one, 5);
//cin.getline(two,5);
cout<<one<<endl;
return 0;
}
运行结果:
iuput:12345
output:1234
/* 注释去掉的话,就会应为two赋值越界而发生运行错误*/
原因有两点:
cin.getline()
会根据streamsize而截断一位,并用空字符填补cin.getline()
为动态数据赋值时,情况特殊,不会考虑越界问题,从而造成内存泄漏,不建议使用
其实,这就像vs2019中对于strcpy_s()用于动态分配的内存时规定必须显式指定赋值数据大小一样。
getline()
- getline(stream,string,delim);
- 读取并舍弃终止符;