cin
文章目錄
- 1 通過cin讀取的數據與變量的類型不匹配
- 2 使用cin輸入時自動跳過空白字符
- 3 使用cin連續輸入多個字符串,個數不確定
- 4 使用getline從標準輸入讀入一行
- 5 使用getch()函數進行無回顯輸入
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常常取:
- 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"); }總結
- 上一篇: 如何开一家电动车专卖店 给感兴趣的投资者
- 下一篇: 字符集:ASCII、GB2312、GBK