用c++写一个分析输入的数的合法性的代码,可能为二进制,八进制,十进制或十六进制,均可添加后缀或不添加,根据输入的数据进制提示,判断美每种数据的合法性
时间: 2024-10-09 10:04:04 浏览: 47
C++实现十六进制字符串转换为十进制整数的方法
在 C++ 中,你可以编写一个简单的函数来解析输入并检查其是否为有效的二进制、八进制、十进制或十六进制数字。以下是一个基本的示例代码:
```cpp
#include <iostream>
#include <string>
#include <cctype>
bool is_valid_number(const std::string &input) {
if (input.empty()) return false;
// 检查前缀,如 '0b', '0o', '0x'
std::string prefix = "0";
size_t prefix_pos = input.find("0");
if (prefix_pos == 0 && (input[prefix_pos + 1] == 'b' || input[prefix_pos + 1] == 'B')) {
prefix = "0b";
} else if (prefix_pos == 0 && (input[prefix_pos + 1] == 'o' || input[prefix_pos + 1] == 'O')) {
prefix = "0o";
} else if (prefix_pos == 0 && (input[prefix_pos + 1] == 'x' || input[prefix_pos + 1] == 'X')) {
prefix = "0x";
if (input.length() <= 2 || !std::isdigit(input[2])) {
return false; // 允许最多4位十六进制数字
}
}
// 去掉前缀,处理剩余部分
input.erase(0, prefix_pos + prefix.length());
// 分别检查二进制、八进制、十六进制和十进制
switch (input.size()) {
case 0:
case 1:
return false; // 非法长度
case 2 and (prefix == "0b" or prefix == "0x"):
return true; // 十六进制可能是两位
default:
for (char c : input) {
if (!std::isxdigit(c)) { // 对于十六进制,只允许数字和字母
if (prefix != "0x") break;
if (!('a' <= c && c <= 'f') && !('A' <= c && c <= 'F')) return false;
}
else if (prefix == "0o" && (c < '0' || c > '7')) return false; // 八进制不允许超出范围
else if (prefix == "0b" && (c < '0' || c > '1')) return false; // 二进制不允许超出范围
}
return true;
}
}
int main() {
std::string num_str;
std::cout << "Enter a number in binary, octal, decimal, or hexadecimal (with optional prefix): ";
std::cin >> num_str;
if (is_valid_number(num_str)) {
std::cout << "The number is valid.\n";
} else {
std::cout << "The number is not valid.\n";
}
return 0;
}
```
阅读全文