如何在不使用模板的情况下实现C++数组的类型校验与错误提示功能
问题解答
关于能否用ASCII比对实现数值类输入校验
可以但非常不推荐,原因如下:
- int和double的合法输入包含多种特殊字符:负号
-、小数点.、科学计数法的e/E,还要处理多字符输入的顺序逻辑(比如负号只能在首位、小数点只能出现1次等),纯靠ASCII比对需要写大量边界判断逻辑,代码会非常冗长,且容易遗漏边界场景出bug。
更简洁的实现方案
直接利用C++标准输入流的状态校验功能,配合错误状态重置、缓冲区清空逻辑即可实现,代码量小且鲁棒性更高,完全符合你的需求:
- 输入后判断
cin.fail()状态,如果返回true说明输入内容和目标变量类型不匹配,属于非法输入 - 每次检测到非法输入后,先调用
cin.clear()重置流的错误状态,再调用cin.ignore()清空输入缓冲区残留的错误内容,避免程序进入死循环
完整参考代码片段
#include <iostream> #include <limits> using namespace std; int main() { char choice; cout << "Enter C for character storing array, I for integer storing array, D for double storing array" << endl; cin >> choice; int n; cout << "Enter size of array: "; cin >> n; // 忽略输入数组大小后残留的换行符 cin.ignore(numeric_limits<streamsize>::max(), '\n'); switch (choice) { case 'C': { char data; char* arr = new char[n]; // 替换原VLA写法,符合标准C++语法,兼容性更好 for (int i = 0; i < n; i++) { cout << "Enter a character value: "; do { cin >> data; if ((data >= 'A' && data <= 'Z') || (data >= 'a' && data <= 'z')) { arr[i] = data; break; } else { cout << "Please enter a CHARACTER: "; // 清空缓冲区多余输入,避免残留内容干扰下一次输入 cin.ignore(numeric_limits<streamsize>::max(), '\n'); continue; } } while (1); } // 这里补充你自己的数组处理逻辑 delete[] arr; break; } case 'I': { int data; int* arr = new int[n]; for (int i = 0; i < n; i++) { cout << "Enter an integer value: "; do { cin >> data; if (!cin.fail()) { arr[i] = data; cin.ignore(numeric_limits<streamsize>::max(), '\n'); break; } else { cout << "Please enter a VALID INTEGER: "; // 重置流错误状态+清空缓冲区 cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); continue; } } while (1); } // 这里补充你自己的数组处理逻辑 delete[] arr; break; } case 'D': { double data; double* arr = new double[n]; for (int i = 0; i < n; i++) { cout << "Enter a double value: "; do { cin >> data; if (!cin.fail()) { arr[i] = data; cin.ignore(numeric_limits<streamsize>::max(), '\n'); break; } else { cout << "Please enter a VALID NUMBER: "; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); continue; } } while (1); } // 这里补充你自己的数组处理逻辑 delete[] arr; break; } default: cout << "Invalid type choice" << endl; } return 0; }
内容的提问来源于stack exchange,提问作者Priya
相关产品推荐
相关产品推荐

