You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++程序无法正确识别序列号对应产品类型问题求助

问题分析

你的代码存在两个核心问题,导致JGU 5001-9999范围的序列号被错误识别为Pdg:

  1. 输入读取不完整:cin >> serialNumber会以空格为分隔符截断输入,当你输入类似JGU 5001的带空格序列号时,serialNumber只存储前缀JGU,后续的数字部分会留在输入缓冲区,导致提取数字时得到空字符串,触发未定义行为(部分编译器会将空字符串转换为0,或抛出异常)。
  2. 固定索引分割不可靠:你使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:24:53