C++ cin详细用法

本文在VS2013+win32+debug环境下,对cin获取缓冲区数据的常用方法如cin>>、cin.get、cin.getline、getline进行测试验证,指出不同方法对结束符的处理情况。还介绍了cin清空输入缓冲区的方法,以及使用cin.ignore()时可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试环境:VS2013+win32+debug

在工作过程中,发现cin的结束符根据不同的成员函数会存在是否被处理的情况,再次进行记录验证。

1、cin获取缓冲区数据

常用方法包括cin>>, cin.get, cin.getline,getline

cin>>

cin是从键盘中读取想要的数据,以空格,tab以及换行作为结束符。

测试代码:

#include<iostream>
#include<string>
using namespace std;

int main(){

	char a;
	int b;
	double c;
	string d;
	cin >> a >> b >> c >> d;
	cout << a << " " << b << " " << c << " " << d << endl;
	system("pause");
	return 0;
}

运行上述程序
我们可以看到运行结果如下:
在这里插入图片描述
在这里需要特别注意的是,
1、cin在检测到实际有效的数据,即非结束符数据时,会忽略数据前所有的结束符等待实际有效数据。
2、读取到有效数据后,之后的结束符cin不会进行处理,而是把它留在缓冲区,由之后的读取操作进行处理,之所以cin连续的时候,不会出现结束符异常问题。是因为之后的cin会忽略掉之前留下的结束符。
3、如果不想忽略空白字符使用noskipws,noskipws 可以做到不忽略任意地方的空格。std::cin >> std::noskipws >> c1 >> c2 >> c3 >> c4;

cin.get

函数原型:

	1、int cin.get();
	2、istream& cin.get(char& var);
	3、istream& get ( char* s, streamsize n );
	4、istream& get ( char* s,  streamsize  n, char delim )。

其中3和4的差别在于是否可以人为指定结束符,char delim.

单个char:

测试程序(1,2一起测试):

#include<iostream>
#include<string>
using namespace std;

int main(){

	char a;
	char b;
	a = cin.get();
	cin.get(b);
	cout << a << " " << b << endl;
	system("pause");
	return 0;
}

结果:
在这里插入图片描述
从上面可以看出,
1、cin.get()并没有忽略结束符,而是直接进行了读取,所以出现了上面只输入了一个字符a,然后回车,程序就执行完成的情况。
2、cin.get()的返回值是int类型,成功则返回读取字符的ASCII码值,遇到文件结束符时,返回EOF,即-1。
3、cin.get(char var)如果成功返回的是cin对象,因此可以支持连续操作,如cin.get(b).get©

字符数组:

测试程序:

#include<iostream>
#include<string>
using namespace std;

int main(){

	char a[20];
	char b;	
	char c[20];
	cin.get(a,20);
	cin.get(b);
	cin.get(c, 20, '7');
	cout << a << " " << b << " " << c << endl;
	system("pause");
	return 0;
}

运行结果:
在这里插入图片描述
从结果我们可以看出,
1、cin.get()的3和4原型在于结束符的人为设定。
2、cin.get()在读取字符数组的时候,仍然不会处理结束符。所以出现,输入完a之后,在进行输入,程序终止。
3、istream& get ( char* s, streamsize n );与cin.getline()功能类似。

cin.getline()

函数原型:

1、istream& getline(char* s, streamsize count); //默认以换行符结束
2、istream& getline(char* s, streamsize count, char delim);

测试程序:

#include<iostream>
#include<string>
using namespace std;

int main(){

	char a[20];
	char b[20];
	cin.getline(a, 20);
	cin.getline(b, 20);
	cout << a << " " << b << endl;
	system("pause");
	return 0;
}

结果:
在这里插入图片描述
从结果可以看出:
1、cin.getline()。不会把结束符留下来,而是直接在本次输入完成后,就处理掉了。

getline

测试程序:

#include<iostream>
#include<string>
using namespace std;

int main(){

	string test;
	getline(cin, test);//不阻塞
	cout << "test:" << test << endl;
	system("pause");
	return 0;
}

结果:
在这里插入图片描述
可以看出:
1、getline();并不会忽略结束符,而是直接进行读取。

cin清空输入缓冲区

cin在使用过程中,因为结束符导致的问题很多,所以可以通过清空缓冲区的方式来去除影响。

函数原型:

istream &ignore( streamsize num=1, int delim=EOF );

函数的作用,是跳过num的字符或者遇到delim终止字符时提前结束。

测试程序:

#include<iostream>
#include<string>
using namespace std;

int main(){

	char a[20];
	char b[20];
	cin.get(a, 5);
	cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
	cin.get(b, 20);
	cout << a << " " << b << endl;
	system("pause");
	return 0;
}

结果:
在这里插入图片描述
由结果看出:
1、程序中使用cin.ignore()成功的去除掉了之前的结束符,从而使我们的cin.get()成功完成读取,其中,numeric_limitsstd::streamsize::max()代表的是最大值,可以使用任意整数代替。如果清空整个缓冲区,可以使用cin.ignoer(numeric_limitsstd::streamsize::max()).
2、cin.ignore()如果缓冲区没有数据的话,会阻塞等待数据的到来。

但是从上面我们看到,我们最初输入的12345,却没有完整打印,这是因为我们限定了长度5,但是同时需要预留结束位“\0”,之后的5和换行符被留在缓冲区。

### C++中`cin`和`cout`的使用方法 #### 输入输出基础概念 在C++编程语言里,输入与输出是借助于流(stream)的概念来完成的。对于程序而言,所有的输入都被视为流入程序的信息流;而所有输出则被看作是从程序流出的信息流[^4]。 #### `cout`作为输出工具的应用 `cout`是C++里的一个ostream类型的对象,专门用来处理向标准输出(大多数情况下是指计算机屏幕)发送数据的任务。为了能够运用`cout`执行打印操作,程序员需要引入<iostream>库,并通常会声明`using namespace std;`以便简化后续代码编写。当想要显示某些内容时,只需利用插入运算符`<<`连接要展示的内容即可[^2]。 例如下面这段简单的代码实现了字符串以及变量值的同时输出: ```cpp #include <iostream> using namespace std; int main(){ string name; cout << "Please enter your name:" ; cin >> name ; //这里先接收用户的名字 cout << "Hello, " << name << "! Welcome to the world of C++." << endl; } ``` 上述例子中,在提示用户之后,通过`cin>>name;`语句获取用户的姓名并存储到名为`name`的字符串变量当中去,紧接着再次调用`cout`连同之前获得的名字一同呈现给使用者。 #### 利用`cin`进行数据收集 另一方面,`cin`则是C++提供的一种从标准输入源(一般指代键盘输入)捕获信息的方法之一。此功能由istream类负责实现,同样位于<iostream>头文件之下。每当期望从外界取得数值型或是字符序列形式的数据时,可以通过组合使用抽取运算符`>>`达成目的。值得注意的是,默认状态下`cin`的行为模式设定为与传统的C风格输入函数保持一致,这意味着两者之间可以无缝衔接工作,除非显式地改变了这种同步机制[^3]。 考虑这样一个场景:假设希望开发一个小应用程序询问访问者的年龄和个人体重,那么就可以按照如下方式构建交互逻辑: ```cpp #include <iostream> using namespace std; int main(){ int age; double weight; cout << "Enter your age: "; cin >> age; cout << "Enter your weight: "; cin >> weight; cout << "Age: " << age << ", Weight: " << weight << endl; return 0; } ``` 在这个案例里面,先是请求用户提供个人的具体岁数,随后又要求告知身体质量指数前后的具体测量结果。每一次`cin>>variableName;`都会暂停程序运行等待有效的键入动作发生直到回车确认为止,接着把相应的值赋给对应的变量名下保存起来供后面进一步加工处理或直接反馈回去查看。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值