C++程序无法正确识别序列号对应产品类型问题求助
问题分析
你的代码存在两个核心问题,导致JGU 5001-9999范围的序列号被错误识别为Pdg:
- 输入读取不完整:
cin >> serialNumber会以空格为分隔符截断输入,当你输入类似JGU 5001的带空格序列号时,serialNumber只存储前缀JGU,后续的数字部分会留在输入缓冲区,导致提取数字时得到空字符串,触发未定义行为(部分编译器会将空字符串转换为0,或抛出异常)。 - 固定索引分割不可靠:你使用
serialNumber.substr(4)提取数字部分,假设前缀和数字之间有且仅有一个空格,但如果输入时前缀和数字直接连在一起(比如JGU5001),这个索引会截取错误的内容(比如JGU5001的substr(4)是001,转换为整数1,落入1-5000范围)。
修正后的代码
#include <iostream> #include <string> #include <stdexcept> using namespace std; string getProductType(string serialNumber) { // 查找空格位置,分割前缀和数字部分 size_t spacePos = serialNumber.find(' '); if (spacePos == string::npos) { // 处理无空格的情况:假设前缀为前3个字符,剩余部分为数字 if (serialNumber.length() < 4) { return "Unknown"; } string prefix = serialNumber.substr(0, 3); string numStr = serialNumber.substr(3); int number; try { number = stoi(numStr); } catch (const invalid_argument&) { return "Unknown"; } catch (const out_of_range&) { return "Unknown"; } if (prefix == "JGU") { if (number >= 1 && number <= 5000) { return "Pdg"; } else if (number >= 5001 && number <= 9999) { return "Skc"; } } else if (prefix == "JGA" || prefix == "JGB") { if (number >= 1 && number <= 9999) { return "Jg"; } } } else { // 处理带空格的情况 string prefix = serialNumber.substr(0, spacePos); string numStr = serialNumber.substr(spacePos + 1); int number; try { number = stoi(numStr); } catch (const invalid_argument&) { return "Unknown"; } catch (const out_of_range&) { return "Unknown"; } if (prefix == "JGU") { if (number >= 1 && number <= 5000) { return "Pdg"; } else if (number >= 5001 && number <= 9999) { return "Skc"; } } else if ((prefix == "JGA" || prefix == "JGB") && number >= 1 && number <= 9999) { return "Jg"; } } return "Unknown"; } int main() { string serialNumber; cout << "Enter the serial number (e.g., JGU 1234 or JGU1234): "; // 使用getline读取完整输入,包含空格 getline(cin, serialNumber); string productType = getProductType(serialNumber); cout << "Product Type: " << productType << endl; return 0; }
关键修改说明
- 输入读取:改用
getline(cin, serialNumber)读取完整的输入行,确保包含空格的序列号能被完整捕获。 - 灵活分割:通过
find(' ')查找空格位置,分别处理带空格和无空格的输入场景;无空格时默认取前3个字符作为前缀,剩余部分为数字。 - 错误处理:增加
try-catch块捕获stoi可能抛出的异常(比如数字部分不是有效整数、超出int范围),避免程序崩溃并返回Unknown。
内容的提问来源于stack exchange,提问作者Elektronika dla początkujących
相关产品推荐
相关产品推荐

