cin
发布日期:2021-07-01 04:22:24 浏览次数:17 分类:技术文章

本文共 3733 字,大约阅读时间需要 12 分钟。

文章目录

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

#include 
   
    #include 
    
     #include 
     
      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 
   
    #include 
    
     #include 
     
      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 
   
    #include 
    
     #include 
     
      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()函数的用法可以参考如下文章,写的非常清晰易懂:。

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

#include 
   
    #include 
    
     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
   
    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");}

转载地址:https://muzimin.blog.csdn.net/article/details/102929940 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:字符集:ASCII、GB2312、GBK、GB18030、Unicode
下一篇:十六进制速查表

发表评论

最新留言

不错!
[***.36.148.159]2022年04月29日 02时36分10秒