cin

本文详细介绍了C++中cin和getline等输入流操作的高级用法,包括数据类型匹配检查、连续输入多个字符串、使用getline读取一行、处理空白字符及无回显输入,适合C++初学者和进阶者学习。

1 通过cin读取的数据与变量的类型不匹配

#include <iostream>
#include <Windows.h>
#include <string>

using namespace std;

int main(void) {
	int a;
	int b;
	int c;

	//std::cin >> a >> b >> c;
	std::cout << "请输入a: ";
	std::cin >> a;
	if (cin.fail()) { //检查输入时是否发生了错误
		cout << "输入错误,应该输入一个整数" << endl;
        //清除错误标记,使得后续输入可以正常进行
		//但是已经输入的数据还在输入缓冲区
		cin.clear(); 		
		cin.sync(); //清空输入缓冲区
	}

	std::cout << "请输入b: ";
	std::cin >> b;
	if (cin.fail()) {
		cout << "输入错误,应该输入一个整数" << endl;
		cin.clear(); //清除错误标记,使得后续输入可以正常进行
		cin.sync(); //清空输入缓冲区
	}

	std::cout << "请输入c: ";
	std::cin >> c;
	if (cin.fail()) {
		cout << "输入错误,应该输入一个整数" << endl;
		cin.clear(); //清除错误标记,使得后续输入可以正常进行
		cin.sync(); //清空输入缓冲区
	}


	std::cout << "a=" << a << std::endl;
	std::cout << "b=" << b << std::endl;
	std::cout << "c=" << c << std::endl;

	system("pause");
	return 0;
}

cin.sync()函数在g++环境下有效,而在VS中无效,VS中可以考虑使用cin.ignore()函数。也可以手动进行清楚缓冲区中的内容,比如自定义一个函数:

void clearBuff() {
	char tmp;
	while ((tmp = getchar()) != '\n');
}

cin.ignore(count, c);
从输入流中提取并丢弃字符,直到遇到下列三种情况:

  1. 提取的字符达到了参数count指定的数量。
  2. 在输入序列中遇到文件结束(EOF)。
  3. 输入序列中的下一个字符为参数c指定的字符(这个字符会被提取并丢弃)。

count常常取:

  • std::numeric_limits<std::streamsize>::max() , 相当于IO流的最大字符个数

常见用法:(把标准输入缓冲区cin的所有数据都清空)

  • cin.ignore(std::numeric_limits<streamsize>::max(), '\n');

2 使用cin输入时自动跳过空白字符

	string university;  //大学
	string profession; //专业

	cout << "你是哪个学习毕业的?学什么专业? ";
	// 输入:     清华     考古     hello
	// 自动跳过空白字符
	cin >> university >> profession; 

	cout << university << "的" << profession << "专业不错哦!"  << endl;

3 使用cin连续输入多个字符串,个数不确定

#include <iostream>
#include <Windows.h>
#include <string>

using namespace std;

int main(void) {
	string food; //专业
	int i = 0;
	
	cout <<  "你喜欢什么美食? ";
	while (cin >> food) { //当用户输入 Ctrl + z 并回车 cin >> food返回0,  0就是假
		i = i + 1;
		cout << "你喜欢的第" << i << "美食是:" << food << endl ;
		cout <<  "你还喜欢吃什么美食? ";
	}

	cout << "你最喜欢的美食有" << i << "种"  << endl;

	system("pause");
	return 0;
}

4 使用getline从标准输入读入一行

#include <iostream>
#include <Windows.h>
#include <string>

using namespace std;

int main(void) {
	string addr; //专业
	
	cout << "你想到哪里去旅行:";
	//从标准输入设备读取一行,但是不包括最后输入的回车符
	getline(cin, addr);

	//empty方法
	if (addr.empty() == true) {
		cout << "您输入了一个空行" << endl;
		return 1;
	}

	//size()和length()完全等效
	//长度是指字符串占用的字节数,如果含有汉字,那么总的字节数和汉字个数不同 
	cout << "地址的长度是:" << addr.size() << endl;
	cout << "地址的长度是:" << addr.length() << endl;


	system("pause");
	return 0;
}

注意: 如果在读入一行前已经读取一个指定类型的数据(比如int类型、double类型等),则必须把缓冲区中回车换行符给清空掉,否则就会无法正常读取新的一行的内容(读取的就是仍在缓冲区中的回车换行符)。

C++中可以使用如下代码:

	string str1, str2;

	cin >> str1;
	cin.ignore();

	getline(cin, str2);

	cout << str1 << endl;
	cout << str2 << endl;

cin.ignore()函数的用法可以参考如下文章,写的非常清晰易懂:一眼就能看懂的cin.ignore()函数详解

C语言中可以使用如下代码:

#include <stdio.h>
#include <Windows.h>

int main(void) {
	char name[16];
	char addr[64];
	
	printf("姑娘芳名?\n");
	scanf("%s", name);
	
	//此时输入缓冲区中还有一个回车符
	//清空输入缓冲区
	fflush(stdin); 

	printf("姑娘家住何地?\n");
	gets(addr); //读一行,包括一行中的空格

	printf("家住%s 的%s, 我中意你!\n", addr, name);

	system("pause");
	return 0;
}

5 使用getch()函数进行无回显输入

#include<conio.h>
void input_pwd(char pwd[], int max_len) {
	char c;
	int i = 0;
		
	while (1) {
		c = getch();
        // getch不从输入缓冲区中读取
		//在getch中,把回车按键输入,识别为回车符'\r'
        //在getchar中,把回车按键输入,识别为换行符'\n'
		if (c == '\r' || i >= max_len) {  
			pwd[i] = 0;
			break;
		}
		pwd[i++] = c;
		printf("*", c);
	}
	printf("\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值