文章目录
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);
从输入流中提取并丢弃字符,直到遇到下列三种情况:
- 提取的字符达到了参数count指定的数量。
- 在输入序列中遇到文件结束(EOF)。
- 输入序列中的下一个字符为参数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");
}