cin:

初学C++的同学们,一定会最先遇到cin和cout,这是C++编程语言中的标准输入输出流对象,包含在文件中。cin主要用于从标准输入读取数据,这里的标准输入是指终端的键盘。

当我们从键盘中输入字符串的时候需要敲一下Enter键才能将这个字符串送入到缓冲区,那么这个回车键会被转换成\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算,如果我们敲入123456这个字符串,敲击一下回车键,那么此时缓冲区中的字节数是7而不是6。

cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin成员函数会阻塞等待数据的到来,数据一来,就出发cin的成员函数去读取数据,所以当我们一开始键入空格或者回车并不会出发cin读取数据。但是一旦读取到数据,遇到空格,tab或者换行符时,便会中断读取。

cin>> 语句读取用户输入的数据时,它会在遇到换行符时停止。换行字符未被读取,而是仍保留在键盘缓冲区中。从键盘读取数据的输入语句只在键盘缓冲区为空时等待用户输入值。

#include<iostream>
using namespace std;
int main()
{
char zifu[80];
cout << "请输入你想要的输入的字符:";
cin >> zifu ;
cout << zifu << endl;
system("pause");
return 0;
}

当我们键入空格空格或者回车时并没有反映,在数据之前的空格或回车都将省略。

C++之cin,gets(),getline(),cin.get(),cin.getline()区别_字符串

当我们输入一串字符串,并空格再输入一串字符串,屏幕只显示空格前的字符串。

C++之cin,gets(),getline(),cin.get(),cin.getline()区别_标准输入_02

表明cin是以空格、tab、或换行符作为分隔符的。

cin.get

cin.get读取一个字符,换行符并不删除

#include <iostream>
using namespace std;
int main()
{
char a;
char b;
a = cin.get();
cin.get(b);
cout << a << "," <<b << "," << endl;
system("pause");
return 0;
}

输入b[回车]

C++之cin,gets(),getline(),cin.get(),cin.getline()区别_字符串_03

显然第二次cin.get()读取了第一次输入的回车键。

当我们一次输入两次b,系统存储的顺序是bb[回车],所以第一次显示b第二次显示b

C++之cin,gets(),getline(),cin.get(),cin.getline()区别_标准输入_04

cin.get()读取一行

#include <iostream>
using namespace std;
int main()
{
char a;
char array[20] = { NULL };
cin.get(array, 20);
cin.get(a);
cout << array << " " << (int)a << endl;
system("pause");
return 0;
}

输入123[空格][空格]123[Tab]12[回车]

C++之cin,gets(),getline(),cin.get(),cin.getline()区别_换行符_05

显示cin.get()不会自动删除回车键,而且空格,Tab键是可以显示出来的。

回车键会留在缓冲区,影响下一次操作,可以在下次输入语句前添加输入cin.get()语句解决。

cin.getline()

从标准输入设备键盘读取一串字符串,并以指定的结束符结束.

#include <iostream>
using namespace std;
int main()
{
char array[20] = { NULL };
cin.getline(array, 20); //或者指定结束符,使用下面一行//cin.getline(array,20,'\n');
cout << array << endl;
system("pause");
return 0;
}

C++之cin,gets(),getline(),cin.get(),cin.getline()区别_标准输入_06

#include <iostream>
using namespace std;
int main()
{
char array[20] = { NULL };
char b;
cin.getline(array, 20); //或者指定结束符,使用下面一行//cin.getline(array,20,'\n');
cin.get(b);
cout << array << "," << b << endl;
system("pause");
return 0;
}

C++之cin,gets(),getline(),cin.get(),cin.getline()区别_字符串_07

给的空间是20个,只显示19个,最后一位结束符。cin.getline() 与 cin.get() 的区别是,cin.getline() 不会将行结束符(如换行符)残留在输入缓冲区中。

getline()

C++ 中定义了一个在 std 名字空间的全局函数 getline(),因为这个 getline() 函数的参数使用了 string 字符串,所以声明在了头文件中了。

getline() 利用 cin 可以从标准输入设备键盘读取一行,当遇到如下三种情况会结束读操作:

(1)文件结束;

(2)遇到行分隔符;

(3)输入达到最大限度。

gets()

gets() 是 C 中的库函数,在头文件 <stdio.h> 申明,从标准输入设备读字符串,可以无限读取,不会判断上限,以回车或者文件结束符 EOF( 即 -1) 结束,所以程序员应该确保 buffer 的空间足够大,以便在执行读操作时不发生溢出。