天天看点

【C++/C】【学习笔记】cin&cout! 基础而重要的两个小问题!一、cin&cout 基础知识二、两个常见问题

本文主要围绕几个常见的问题进行讲解,故涉及的基础知识讲解来源于网络

一、cin&cout 基础知识

相关基础知识可以参考这篇文章:

点击打开链接

二、两个常见问题

1. 输入一个完整句子/空格

在C++中,cin输入字符串时遇到空格、回车(“\r”会在输入时被转化为换行符”\n“)即会停止输入,

因此,常出现以下情况:

【C++/C】【学习笔记】cin&cout! 基础而重要的两个小问题!一、cin&cout 基础知识二、两个常见问题
【C++/C】【学习笔记】cin&cout! 基础而重要的两个小问题!一、cin&cout 基础知识二、两个常见问题

此时,即需要用到getline函数~

【C++/C】【学习笔记】cin&cout! 基础而重要的两个小问题!一、cin&cout 基础知识二、两个常见问题
【C++/C】【学习笔记】cin&cout! 基础而重要的两个小问题!一、cin&cout 基础知识二、两个常见问题

问题便能得到解决~

2. 输入类型错误导致cin错误

cin有四个bool类型的状态标识,绝大多数人都对它们感到陌生:

#include <iostream>
#include <string>

using namespace std;

int main(){
	int a;
	
	//正确输入 
	cin >> a;
	cout << cin.bad();	//系统级错误(如流被破坏、不完整),一旦置位1,整个流便无法使用 
	cout << cin.eof();	//读取到EOF(文件终止符)置位1 
	cout << cin.fail();	//读取到EOF(文件终止符),或错误输入(int型变量输入字母等)置位1 
	cout << cin.good();	//可用状态置位1 
	cout << endl;
	//错误输入 
	cin >> a;
	cout << cin.bad();	//系统级错误(如流被破坏、不完整),一旦置位1,整个流便无法使用 
	cout << cin.eof();	//读取到EOF(文件终止符)置位1 
	cout << cin.fail();	//读取到EOF(文件终止符),或错误输入(int型变量输入字母等)置位1 
	cout << cin.good();	//可用状态置位1 
	
	return 0;
}

           

两种输入对比:

【C++/C】【学习笔记】cin&amp;cout! 基础而重要的两个小问题!一、cin&amp;cout 基础知识二、两个常见问题

在命令行中输入Ctrl+Z模拟EOF:

【C++/C】【学习笔记】cin&amp;cout! 基础而重要的两个小问题!一、cin&amp;cout 基础知识二、两个常见问题

了解到以上情况以后,再介绍两个相关函数:

cin.clear()以及cin.sync();

cin.clear():将错误置位恢复(不包括bad的情况);

cin.sync():清空流;

分析过程:

输入错误 -> failbit置1 -> 流中存有输入错误导致无法读入的输入内容 -> 无法正常使用cin

使用cin.clear() -> 重置failbit -> cin恢复正常 -> 使用cin.sync()清空流中原有的内容防止影响之后输入 -> 重新输入

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

int main(){
	int a;
	
	//错误输入 
	cin >> a;
	cout << cin.bad();	//系统级错误(如流被破坏、不完整),一旦置位1,整个流便无法使用 
	cout << cin.eof();	//读取到EOF(文件终止符)置位1 
	cout << cin.fail();	//读取到EOF(文件终止符),或错误输入(int型变量输入字母等)置位1 
	cout << cin.good();	//可用状态置位1 
	cout << endl; 
	
	//恢复
	cin.clear();		//恢复cin.fail(); 
	cin.sync(); 		//清空流 
	
	//重新输入 
	cin >> a;
	cout << cin.bad();	//系统级错误(如流被破坏、不完整),一旦置位1,整个流便无法使用 
	cout << cin.eof();	//读取到EOF(文件终止符)置位1 
	cout << cin.fail();	//读取到EOF(文件终止符),或错误输入(int型变量输入字母等)置位1 
	cout << cin.good();	//可用状态置位1 
	cout << endl;
	cout << a; 
	return 0;
}
           

错误输入修正:

【C++/C】【学习笔记】cin&amp;cout! 基础而重要的两个小问题!一、cin&amp;cout 基础知识二、两个常见问题

EOF修正:

【C++/C】【学习笔记】cin&amp;cout! 基础而重要的两个小问题!一、cin&amp;cout 基础知识二、两个常见问题

以上拙见浅薄,如有谬误还望大犇们批评指正!

//Szp 2018.5.2